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日

悬赏问题

  • ¥50 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?