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

2022-08-31 10:05:42

我刚刚在下面的lambda表达式中替换为:s_

s -> Integer.parseInt(s)

Eclipse编译器 说:

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

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


答案 1

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

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

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

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


答案 2

这是 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、方法或 catch 形式参数。


推荐