Java 最终字符串参数未标记为 lambda 表达式中的编译时错误
Java final string parameter is not marked as compile time error in lambda expression
考虑以下代码:
public class Test {
interface Changeable {
void change(String s);
}
public static void main(String[] args) {
Test t = new Test();
Changeable c = (s) -> s = s + " World"; // Line 1
final String str = "Hello";
t.changeIt(str, c); // Line 2
t.changeIt(str, (s) -> s = s + " Hello"); // Line 3
System.out.println(str);
}
public void changeIt(String s, Changeable c) {
c.change(s);
}
}
在这种情况下,最终变量 str
如何能够满足上述 lambda。也许我对代码的解释有误,但它 看起来 就像 lambda 表达式正在重新分配 str
变量。 运行 代码(并看到它编译)显然与此矛盾,我错过了什么?
您的表达式等同于:
Changeable c = new Changeable() {
void change(String s) {
s = s + "World";
}
}
但是 s 是字符串的本地引用,因此重新分配 s 并没有更改原始 str 引用,只是更改了本地引用。
例如看这个:
public static void main(String[] args) {
final String str = "Hello";
changeIt(str);
}
public static void changeIt(String s){
s = s + "World";
}
Java 中的括号描述了您的范围。这样的字符串 str
仅存在于您的 main
-Method 的范围内。如果您传递它并重新分配它,那不会影响 str
,因此它不会干扰 final
.
考虑以下代码:
public class Test {
interface Changeable {
void change(String s);
}
public static void main(String[] args) {
Test t = new Test();
Changeable c = (s) -> s = s + " World"; // Line 1
final String str = "Hello";
t.changeIt(str, c); // Line 2
t.changeIt(str, (s) -> s = s + " Hello"); // Line 3
System.out.println(str);
}
public void changeIt(String s, Changeable c) {
c.change(s);
}
}
在这种情况下,最终变量 str
如何能够满足上述 lambda。也许我对代码的解释有误,但它 看起来 就像 lambda 表达式正在重新分配 str
变量。 运行 代码(并看到它编译)显然与此矛盾,我错过了什么?
您的表达式等同于:
Changeable c = new Changeable() {
void change(String s) {
s = s + "World";
}
}
但是 s 是字符串的本地引用,因此重新分配 s 并没有更改原始 str 引用,只是更改了本地引用。
例如看这个:
public static void main(String[] args) {
final String str = "Hello";
changeIt(str);
}
public static void changeIt(String s){
s = s + "World";
}
Java 中的括号描述了您的范围。这样的字符串 str
仅存在于您的 main
-Method 的范围内。如果您传递它并重新分配它,那不会影响 str
,因此它不会干扰 final
.