为什么作为参数传递的lambda无法在内部重新定义变量

时间:2019-04-26 00:06:02

标签: java lambda

当传递lambda作为参数时,为什么Java编译器不允许我们在函数的本地范围内创建同义变量?

/MyClass.java:12: error: variable s is already defined in method main(String[])
        s.forEach(s -> System.out.println(s));
              ^
1 error

错误:

 <input id="labelDTOS0.labelItemDTOS0.newValue" 
 name="labelDTOS[0].labelItemDTOS[0].newValue" type="text" value=""/>

1 个答案:

答案 0 :(得分:1)

在声明“ func”时,范围内没有“ s”,因此lambda表达式的形式参数“ s”不会遮盖任何东西。

使用lambda表达式作为实际参数调用s.foreach时,作用域中存在一个s,因此lambda表达式的形式参数s掩盖了现有的s。是非法的。

语言规范的适当部分是描述scopeshadowing的部分。这个问题并不只针对lambda表达式;由于您对'func'声明的偶然放置(恰好在's'之前),所以看起来可能是这样。