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

dldeef67  于 2023-05-27  发布在  Java
关注(0)|答案(4)|浏览(188)

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

s -> Integer.parseInt(s)

Eclipse compiler说道:
“_”不应用作标识符,因为它是源代码级别1.8以上的保留关键字。
我在JLS §3.9词汇结构/关键词中没有找到任何解释。

fjnneemd

fjnneemd1#

要查看的地方是JLS §15.27.1。Lambda参数

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

不鼓励在任何上下文中使用变量name _。Java编程语言的未来版本可能会将此名称保留为关键字和/或给予特殊的语义。
所以Eclipse消息是误导性的,特别是当两种情况下使用相同的消息时,当为lambda参数生成错误时,或者当为任何其他_标识符生成警告时。

hfsqlsce

hfsqlsce2#

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

下划线的处理

在许多语言中,通常使用下划线(_)来表示未命名的lambda参数(方法和异常参数也是如此):
BiFunction<Integer, String, String> biss = (i, _) -> String.valueOf(i);
这允许对未使用的参数进行更强的静态检查,还允许将多个参数标记为未使用。然而,由于下划线在Java 8中是一个有效的标识符,兼容性要求我们采取一种更间接的方式来实现下划线在Java中的作用。第一阶段禁止在Java 8中使用下划线作为lambda形式参数名(这没有兼容性后果,因为lambda以前不存在),并对在其他地方使用下划线作为标识符发出警告。第二阶段是在Java 9中,当这个警告变成错误时。我们现在可以自由地完成下划线的计划恢复,以指示未使用的lambda,方法或catch形式参数。

tez616oj

tez616oj3#

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

从Java 9开始,字符不能再作为标识符使用,不仅仅是在lambda上下文中
下划线字符不是法律的的名称。
如果使用下划线字符(“
”)作为标识符,则无法再编译源代码。

omhiaaxx

omhiaaxx4#

tl;dr

随着Java的发展,下划线字符有了新的特殊含义。

Underscore获得新含义,省略类型和名称

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

  • elide模式匹配中record组件的类型和名称。
  • 在类型模式中省略跟随类型或变量的标识符。

参见JEP 443: Unnamed Patterns and Variables (Preview)

Java 9+不允许下划线作为标识符

下划线字符(_)是十进制代码点95,十六进制5 F。在Unicode标准中正式命名为LOW LINE
使用下划线作为标识符会引发:

  • Java 8中的警告
  • Java 9+中的错误

参见:JEP 213: Milling Project Coin

相关问题