_(下划线)是保留关键字

时间:2014-05-07 17:02:20

标签: java lambda java-8

我刚刚用s替换了以下lambda表达式中的_

s -> Integer.parseInt(s)

Eclipse编译器说:

  

'_'不应该用作标识符,因为它是来自源级别1.8的保留关键字。

我在JLS §3.9词汇结构/关键字中找不到任何解释。

3 个答案:

答案 0 :(得分:79)

要看的地方是JLS §15.27.1. Lambda Parameters

  

如果lambda参数的名称为_(即单个下划线字符),则为编译时错误。

     

不鼓励在任何上下文中使用变量名_。 Java编程语言的未来版本可以将此名称保留为关键字和/或赋予其特殊语义。   功能

因此,Eclipse消息具有误导性,尤其是当为lambda参数生成错误或为任何其他_标识符生成警告时,两种情况都使用相同的消息。

答案 1 :(得分:10)

这是JEP 302的第2阶段,它将添加下划线作为特殊字符,以表示lambda表达式中未使用的参数。

  

下划线的处理

     

在许多语言中,通常使用下划线(_)来表示未命名的lambda参数(方法和异常参数也是如此):

     

BiFunction<Integer, String, String> biss = (i, _) -> String.valueOf(i);

     

这可以对未使用的参数进行更强的静态检查,还可以将多个参数标记为未使用。但是,由于下划线是Java 8以来的有效标识符,因此兼容性要求我们采取更间接的途径来获取下划线可以在Java中担当此角色的位置。第1阶段禁止在Java 8中将下划线用作lambda形式参数名称(这不会产生兼容性,因为lambda以前不存在),并且在其他位置使用下划线作为标识符已发出警告。当此警告变为错误时,阶段2进入Java 9。现在,我们可以自由完成下划线的计划修复,以指示未使用的lambda,方法或捕获形式参数。

答案 2 :(得分:5)

Java SE 9的Java语言更改 https://docs.oracle.com/javase/9/language/toc.htm#JSLAN-GUID-16A5183A-DC0D-4A96-B9D8-AAC9671222DD

从Java 9开始,_字符不能再用作标识符,而不仅仅是在lambda上下文中

  

下划线字符不是合法名称。

     

如果您使用下划线字符(“_”)作为标识符,则无法再编译源代码。