在一种方法中,我有这个:
int x = 0
if (isA()) {
x = 1;
} else if (isB()) {
x = 2;
}
if (x != 0) {
doLater(() -> showErrorMessage(x)); // compile error here
}
// no more reference to 'x' here
我不明白为什么会产生编译错误。该错误表明x
它不是最终的,也不是有效的最终确定的,因此无法从lambda主体进行访问。调用x
后没有对的修改doLater
,因此x
实际上在doLater
调用时已确定的值。
我猜这个问题的答案是因为x
没有资格被称为有效最终变量。但是,我想知道原因是什么。
编译器不能只是创建一个临时的最终变量,从而使代码像这样:
if (x != 0) {
final int final_x = x;
doLater(() -> showErrorMessage(final_x));
}
一切仍然一样吗?
有效地最终意味着它可以实现,final
即永远不变。这意味着变量实际上可以是final
一个。
问题在于它不会跟踪您上次更改它的时间,而是您曾经更改过它。将您的if
声明更改为
int x;
if (isA()) {
x = 1;
} else if (isB()) {
x = 2;
} else {
x = 0;
}
要么
int x = isA() ? 1 :
isB() ? 2 : 0;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句