下划线是一个保留关键字,与编程有关。

106

我刚刚将以下lambda表达式中的s替换为_:

s -> Integer.parseInt(s)

Eclipse编译器表示:

不能将“_”用作标识符,因为它是从1.8源级别起的保留关键字。

JLS §3.9词法结构/关键字中没有找到任何解释。

4个回答

92

需要查找的地方是JLS §15.27.1. Lambda Parameters

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

在任何情况下都不建议使用变量名“_”。未来版本的Java编程语言可能会将此名称保留为关键字和/或赋予其特殊语义。

因此,Eclipse的消息是误导性的,特别是由于相同的消息用于两种情况:当生成lambda参数的错误时或者当为任何其他_标识符生成警告时。


27
请注意,从Java 9开始,_将不再被允许作为任何合法的标识符名称,而不仅仅是用作lambda参数名称。实际上,这个问题已经在build 43中得到修复:https://bugs.openjdk.java.net/browse/JDK-8061549 - Jean-François Savard
4
“Java编程语言的未来版本可能会将这个名称作为关键字保留和/或赋予它特殊的语义”这个声明不够吗?如果将“可能保留”替换为“将使用”,你就可以理解了。也许这封邮件的引用可以帮助你…… - Holger
11
这是什么?Java破坏了向后兼容性吗? - Arturo Torres Sánchez
11
@Arturo Torres Sánchez说:“这并不新鲜。过去enumassert也是合法的标识符......” - Holger
12
实际上有很多编程语言都使用下划线作为名称的占位符(例如Scala、Clojure、F#、SML、Erlang等),这是一个早在90年代或80年代就已经确立的模式,因此不遵循它会显得奇怪。 - om-nom-nom
显示剩余7条评论

36

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

下划线的处理

许多语言都常使用下划线(_)表示未命名的 lambda 参数(方法和异常参数同理):

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

这样可以更强地静态检查未使用的参数,并且允许标记多个参数未使用。但由于在 Java 8 中下划线是有效的标识符,所以兼容性要求我们采取更间接的方式使其在 Java 中扮演此角色。第一阶段是在 Java 8 中禁止下划线作为 lambda 形式参数名称(因为之前不存在 lambda,所以这不会影响兼容性),并对在其他位置使用下划线作为标识符发出警告。第二阶段在 Java 9 中进行,当该警告成为错误时。现在,我们可以自由地完成计划中的下划线恢复,以表示未使用的 lambda、方法或 catch 形式参数。


3
这个用法在Brian Goetz的2017年11月Devoxx演讲中被讨论过,该演讲是关于Project Amber的(http://openjdk.java.net/projects/amber/)。 - Basil Bourque
2
我们目前使用“$”来实现此目的。 - aventurin
9
我现在使用的是Java 14,但仍然无法将下划线作为未命名的lambda参数。无论JCP旨在实现什么,似乎它们已经实现了相反的效果。 - Frans
1
@Frans 注意,JEP目前仅处于候选阶段。它尚未完成。 有关JEP流程的更多详细信息,请参见[JEP 1](https://openjdk.java.net/jeps/1) - Alexandre de Champeaux
1
@Manuel 我喜欢使用两个下划线作为未使用的参数,但我从来没有见过其他人这样做。 - Sapphire_Brick
显示剩余2条评论

7

3

tl;dr

随着Java的演变,下划线字符具有了特殊的新含义:省略记录组件的类型和名称。

下划线 = 省略类型和名称

Java 21中的预览功能中,我们可以看到下划线字符用于:

  • 省略模式匹配中记录组件的类型和名称。
  • 省略类型模式中类型或var后面的标识符。

请参阅JEP 443: 未命名模式和变量(预览)

Java 9+中禁止使用下划线作为标识符。

下划线字符(_)的代码点是95十进制,5F十六进制。在Unicode标准中正式命名为LOW LINE
在Java 8中,使用下划线作为标识符会引发警告。
在Java 9+中,使用下划线作为标识符会引发错误。
参见:JEP 213: Milling Project Coin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接