【发布时间】:2017-01-24 22:37:51
【问题描述】:
来自Java8 Lambdas vs Anonymous classes:
“...[Anonymous Inner Classes] 引入了一个新的范围。也就是说,名称是从 AIC 的超类和接口解析的,并且可以隐藏出现在词法封闭环境中的名称。对于 lambda,所有名称都按词法解析。”
鉴于上述关于范围的陈述,如果简单地转换为 Lambda,执行方式不同的 Java 匿名内部类会是什么样子?
这两段代码看起来行为相同:
button.addClickHandler(clickEvent -> doSomething());
和
button.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent clickEvent) {
doSomething();
}
});
但是如果内部方法是doSomething(this) 会是这样吗?还是doSomething(myVariable)?
范围的变化很重要以及它的行为方式的一个例子是非常棒的。我知道 Lambda 在其他方面与匿名内部类不同,但我还没有找到任何好的解释。
【问题讨论】:
-
您想不出这样的场景:代码的行为(或编译)可能会因
this所指的内容而有所不同?这应该不会太难。 -
具体参考
this:我的问题可以解读为“AIC 和 Lambda 之间的范围差异是否使得this在两者之间有所不同?如果是,它指向什么?在 Lambda 的情况下?” -
是的,有区别。在匿名类中,它指向匿名类实例。在 lambda 中,它指向 lambda 之外的任何内容。
-
请注意,有一个 JEP 正在考虑中,它可能会在未来的版本中取消对 lambdas 中变量阴影的限制。