请解释为什么lambda表达式可以使用和修改其封闭类的实例变量,但只能使用其封闭作用域的局部变量。(除非它是最终的或有效的最终的?)
我的基本问题是,在作用域的上下文中,如何在lambda中修改类的实例变量,而不能修改局部变量。
发布于 2018-03-01 23:48:36
你可以参考这篇文章- https://www.infoq.com/articles/Java-8-Lambdas-A-Peek-Under-the-Hood解释的lambda表达式编译。正如所解释的,λ表达式/代码块被编译成匿名类,这些匿名类是以名称格式(<<Enclosing Class name>>$<<1(Number)>>
)编译的,因此假设如果允许非最终局部变量,则编译器不能从该局部变量被引用为匿名类的位置跟踪它。‘'.class’文件像普通java类一样以上述格式被单独创建/编译。
因此,如果局部变量是final,那么编译器会在无源类中创建一个final实例,这不会给编译器带来歧义。有关详细信息,请参阅上面提到的链接
https://stackoverflow.com/questions/32272713
复制相似问题