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日

悬赏问题

  • ¥15 k8s集群重启后,kubelet一直报systemctl restart kubelet.service "Failed to delete cgroup paths"
  • ¥15 微信小程序构建工具类发布到npm,install后报错
  • ¥15 amesim液压仿真问题
  • ¥15 python解析json文件时报错
  • ¥15 MATLAB优化设计
  • ¥15 ANN预测模型 200大米
  • ¥20 优秀学生的问题 oj java
  • ¥15 scratch-gui 如何集成进 react native
  • ¥15 把全局悬浮窗改为局内悬浮窗
  • ¥15 Excel vba编程调用word如何读取换行符