[英]_ (underscore) is a reserved keyword
我刚刚将以下 lambda 表达式中的s
替换为_
:
s -> Integer.parseInt(s)
Eclipse 编译器说:
'_' 不应用作标识符,因为它是源代码级别 1.8 之后的保留关键字。
我在JLS §3.9词法结构/关键字中没有找到任何解释。
要看的地方是JLS §15.27.1。 Lambda 参数
如果 lambda 参数具有名称 _(即单个下划线字符),则会出现编译时错误。
不鼓励在任何上下文中使用变量名称 _。 Java 编程语言的未来版本可能会将此名称保留为关键字和/或赋予它特殊的语义。
因此 Eclipse 消息具有误导性,尤其是在两种情况下使用相同的消息时,当为 lambda 参数生成错误或为任何其他_
标识符生成警告时。
这是JEP 302的第 2 阶段,将添加下划线作为特殊字符来表示 lambda 表达式中未使用的参数。
下划线的处理
在许多语言中,通常使用下划线 (
_
) 来表示未命名的 lambda 参数(对于方法和异常参数也是如此):
BiFunction<Integer, String, String> biss = (i, _) -> String.valueOf(i);
这允许对未使用的参数进行更强的静态检查,并且还允许将多个参数标记为未使用。 然而,因为下划线是 Java 8 的有效标识符,兼容性要求我们采取更间接的路径来到达下划线在 Java 中可以发挥这一作用的地方。 阶段 1 禁止在 Java 8 中将下划线作为 lambda 形式参数名称(这没有兼容性后果,因为之前不存在 lambdas)并且发出警告以在其他地方使用下划线作为标识符。 第 2 阶段出现在 Java 9 中,当此警告变成错误时。 我们现在可以自由完成下划线的计划修复,以指示未使用的 lambda、方法或捕获形式参数。
Java SE 9 的 Java 语言更改https://docs.oracle.com/javase/9/language/toc.htm#JSLAN-GUID-16A5183A-DC0D-4A96-B9D8-AAC9671222DD
从 Java 9 开始,_ 字符不能再用作标识符,而不仅仅是在 lambda 上下文中
下划线字符不是合法名称。
如果您使用下划线字符(“_”)作为标识符,您的源代码将无法再编译。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.