我知道您不能在lambda中使用非final /有效的final变量。如果发生这种情况,则可能是您正在处理该对象的过时版本。我发现编译器没有抱怨此代码,其中函数参数可能不是最终的:
使用完整代码更新帖子:
public static void main(String[] args) {
Object x=new Object();
x=new Object();// I can reassign x as much as I can
test(x);
}
public static void test(Object x) {
// I can't reassign x here, shouldn't it disallow me to use function parameter ?
List<String> list=new ArrayList<>();
list.forEach(entry->System.out.println(entry+x)); // x here could be not final why the compiler didn't complain ?
}
答案 0 :(得分:4)
答案就在您的问题中:因为x
中的test
是有效的 ,因为test
中的任何内容都没有赋值。
请注意,x
中的test
和x
中的main
之间没有任何联系。在main的某一点上,您确实读取了main
的{{1}}的值并将该值传递给x
,但传递的是 value ,而不是与test
变量本身的某种连接或链接。 (Java是纯粹的pass-by-value语言。)两个x
之间没有持续的连接。它们恰好都包含相同的值(对象引用)。可以分配给x
的{{1}}的事实与是否可以分配给main
的{{1}}无关。
答案 1 :(得分:3)
因为它实际上是最终的。变量或参数的值在初始化后从未更改,实际上是最终的。