首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对lambda表达式中最后字段的引用

对lambda表达式中最后字段的引用
EN

Stack Overflow用户
提问于 2015-05-08 18:05:29
回答 1查看 567关注 0票数 11

最近,我在匿名类和lambda表达式之间发现了一个微妙的区别:

代码语言:javascript
复制
public class FinalTest {
    final Runnable x = new Runnable() {
        @Override
        public void run() {
            System.out.println(x.hashCode());
        }
    };

    final Runnable y = () -> System.out.println(y.hashCode()); 
}

通常lambda等同于匿名类。甚至我的Eclipse也进行了重构,将x转换为lambda (它与y完全一样),并将y转换为匿名类(它与x完全一样)。然而,lambda给了我一个编译错误,而匿名类可以完全编译。错误消息如下所示:

代码语言:javascript
复制
>javac FinalTest.java
FinalTest.java:9: error: self-reference in initializer
    final Runnable y = () -> System.out.println(y.hashCode());
                                                ^
1 error

所以问题是:为什么会有这么大的差别?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-08 18:14:10

这与JLS #8.3.3处理前向引用有关。特别是,如果使用完全限定的名称,它会编译(因为该规则的第三个条件变为假,所以在C的实例变量初始化程序或C的实例初始化程序中,使用都是一个简单的名称):

代码语言:javascript
复制
final Runnable y = () -> System.out.println(this.y.hashCode());

对于匿名类,第四个条件(C是封装使用的最内部类或接口)是不正确的,因为封闭类本身就是匿名类。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30130148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档