arrayOfSky 2021-12-23 15:45 采纳率: 100%
浏览 52
已结题

lambda表达式调用默认方法

问题遇到的现象和发生背景

为什么我注释掉的代码编译不能过呢?
为什么lambda表达式实现的抽象方法的方法体中不能调用默认方法呢?
通过测试,我发现他不仅不可以调用默认方法,甚至不能调用当前对象的方法,比如说hashcode什么的。
为什么呢?

问题相关代码,请勿粘贴截图
public class shape{
    public static void main(String[] args) {
        a c = new a(){
            @Override
            public void a(){
                this.hashCode();
                b();
            }
        };
        a d = () -> {
//            this.hashCode();//编译错误
//              b();//编译错误
        };
    }
}
@FunctionalInterface
interface a{
    void a();
    default void b(){
        System.out.println(this.hashCode());
    }
}
  • 写回答

3条回答 默认 最新

  • 俺不理解 2021-12-23 16:13
    关注

    这是根据lambda表达式的词作用域有关的,lambda表达式虽然也会构建一个类,但是内部却没有自己的this指针,当在内部使用this指针时,代指的是表达式外部对应的对象。

    this.hashcode()报错是因为当前main是static方法,所以无法调用当前类的this指针
    b() 报错也是因为shape类中没有b()方法,因为lambda的词作用域是当前类


    在Java官方文档里有这样一句话:

    Lambda expressions are lexically scoped. This means that they do not inherit any names from a supertype or introduce a new level of scoping. Declarations in a lambda expression are interpreted just as they are in the enclosing environment.

    就是说lambda表达式为词法作用域,即它不会从父类继承任何名字,也不会引入新的作用域。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月23日
  • 已采纳回答 12月23日
  • 创建了问题 12月23日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效