【发布时间】:2019-10-23 17:09:39
【问题描述】:
这个问题在这里已经有了答案:
但我读了一篇文章(Why Do Local Variables Used in Lambdas Have to Be Final or Effectively Final?)。它发布了一个示例:
Supplier<Integer> incrementer(int start) {
return () -> start++;
}
代码将转换编译错误。帖子试图解释原因并说:
这不会编译的基本原因是 lambda 正在捕获 start 的值,这意味着制作它的副本。强制变量为 final 可以避免给人一种印象,即在 lambda 中递增 start 实际上会修改 start 方法参数。 但是,为什么要复制呢?好吧,请注意我们正在从我们的方法中返回 lambda。因此,在 start 方法参数被垃圾回收之后,lambda 才会运行。 Java 必须复制 start 才能使该 lambda 存在于该方法之外。
我无法理解它的解释,我有两个问题:
- “直到 start 方法参数被垃圾回收后 lambda 才会运行”是什么意思?
- 为什么要复制?
【问题讨论】:
-
当您不理解该解释时,为什么不忽略它并使用您承认的三个问答之一来回答您的问题?