如何解决Java 最终字符串参数未在 lambda 表达式中标记为编译时错误
考虑以下代码:
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
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。