【发布时间】:2016-10-27 11:16:09
【问题描述】:
我有一个匿名内部类和一个等效的 lambda。为什么 lambda 的变量初始化规则更严格,有没有比匿名内部类更干净的解决方案或在构造函数中对其进行初始化?
import java.util.concurrent.Callable;
public class Immutable {
private final int val;
public Immutable(int val) { this.val = val; }
// Works fine
private final Callable<String> anonInnerGetValString = new Callable<String>() {
@Override
public String call() throws Exception {
return String.valueOf(val);
}
};
// Doesn't compile; "Variable 'val' might not have been initialized"
private final Callable<String> lambdaGetValString = () -> String.valueOf(val);
}
编辑:我确实遇到了一种解决方法:为val 使用吸气剂。
【问题讨论】:
-
有趣的是,如果你删除
val上的final修饰符,它会编译... -
当您将
String.valueOf(val)更改为String.valueOf(Immutable.this.val)时,它也会编译 -
@csharpfolk
this代替Immutable.this也可以。 -
@lucasvw 我正在使用这个“在线 java ide”站点:compilejava.net,但它仅适用于
this。
标签: java lambda anonymous-inner-class