gpt4 book ai didi

java - 数组类型中的闭包

转载 作者:行者123 更新时间:2023-11-29 07:27:44 25 4
gpt4 key购买 nike

考虑以下代码:

Integer[] arr = new Integer[] {1,2};
Consumer<Integer> lm1 = a -> {
arr[1] = a; // accepted without any problem
System.out.println(arr[1]);
};

lm1.accept(100);

但是编译器对此有问题:

Integer b = 10;
Consumer<Integer> lm2 = a -> {
b = a; // compiler complains
System.out.println(b);
};

lm2.accept(20);

我知道如果我在代码段 1 中使用 new Integer[]{1} 重新初始化 arr 会导致错误,但我更想了解原因片段 1 没有导致任何错误?

最佳答案

区别在于间接层数:

  • 第一个例子关闭了一个数组,当你分配时它保持不变:arr 是固定的,arr[1] 不是
  • 第二个示例关闭 Integer 对象,您尝试在赋值 b=a 中更改该对象。这是不允许的。

请注意,此行为不是特定于数组的:任何可变对象都可用于实现间接。例如,您可以使用可设置的 AtomicInteger:

AtomicInteger b = new AtomicInteger(10);
Consumer<Integer> lm2 = a -> {
b.set(a); // compiler complains
System.out.println(b);
};
lm2.accept(20);

关于java - 数组类型中的闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48358886/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com