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 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵