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

问题描述 投票:0回答:4

我刚刚将以下 lambda 表达式中的

s
替换为
_
:

s -> Integer.parseInt(s)

Eclipse 编译器说:

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

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

java lambda java-8
4个回答
92
投票

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

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

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

因此 Eclipse 消息具有误导性,特别是当为 lambda 参数生成错误或为任何其他

_
标识符生成警告时,这两种情况使用相同的消息。


36
投票

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

下划线的处理

在许多语言中,通常使用下划线 (

_
) 来表示未命名的 lambda 参数(方法和异常参数也类似):

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

这允许对未使用的参数进行更强有力的静态检查,并且还允许将多个参数标记为未使用。然而,由于下划线是 Java 8 中的有效标识符,因此兼容性要求我们采取更间接的途径来实现下划线在 Java 中发挥这一作用的位置。第 1 阶段禁止在 Java 8 中将下划线作为 lambda 形式参数名称(这没有兼容性后果,因为以前不存在 lambda),并且针对在其他地方使用下划线作为标识符发出了警告。 Java 9 中出现了第 2 阶段,此时此警告变成了错误。我们现在可以自由地完成下划线的计划修复,以指示未使用的 lambda、方法或 catch 形式参数。


7
投票

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

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

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

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


3
投票

tl;博士

随着 Java 的发展,下划线字符呈现出一种特殊的新含义:省略

record
组件的类型和名称。

下划线 = 省略类型和名称

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

  • elide模式匹配中record组件的类型和名称。
  • 删除类型模式中类型或 var 之后的标识符。

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

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

下划线字符 (

_
) 是十进制代码点 95,十六进制代码点 5F。在
Unicode
标准中正式命名为 LOW LINE

使用下划线作为标识符会抛出:

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

参见:JEP 213:铣削项目硬币

© www.soinside.com 2019 - 2024. All rights reserved.