Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java _(下划线)是保留关键字_Java_Lambda_Java 8 - Fatal编程技术网

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

Java _(下划线)是保留关键字,java,lambda,java-8,Java,Lambda,Java 8,我刚刚将以下lambda表达式中的s替换为。: s -> Integer.parseInt(s) Eclipse编译器说: “”不应用作标识符,因为它是源级别1.8上的保留关键字 我还没有在词汇结构/关键词中找到任何解释。要查找的地方是 如果lambda参数的名称为(即单个下划线字符),则为编译时错误。 不鼓励在任何上下文中使用变量名u。Java编程语言的未来版本可能会将此名称保留为关键字和/或赋予其特殊语义。 因此,Eclipse消息具有误导性,特别是当为lambda参数生成错误或为

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

s -> Integer.parseInt(s)
Eclipse编译器说:

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

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

要查找的地方是

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

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


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

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

下划线字符不是合法名称

如果使用下划线字符(“389;”)作为标识符,则无法再编译源代码

在的第2阶段,将添加下划线作为特殊字符,以表示lambda表达式中未使用的参数

下划线的处理 在许多语言中,通常使用下划线(
\u
)来表示未命名的lambda参数(方法和异常参数也是如此):

BiFunction biss=(i,)->String.valueOf(i)

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


请注意,从Java 9开始,
\uuu
将不允许作为任何合法标识符名称,而不仅仅是作为lambda参数名称。这实际上是在build43:@lscoughlin:中修复的:“Java编程语言的未来版本可能会将此名称保留为关键字和/或赋予其特殊语义”语句是否足够?好吧,把“may reserve”换成“will use”,你就会明白了。也许有帮助…这是什么?Java破坏了向后兼容性?@Arturo Torres Sánchez:这不是什么新鲜事。有时候,
enum
assert
是合法的标识符…@Holger实际上有很多语言使用下划线作为名称占位符(Scala、Clojure、F#、SML、Erlang等等)。这是一个可以追溯到90年代或80年代的既定模式,我相信,因此不遵守它是很奇怪的。Brian Goetz在关于中讨论了这个用法。好的,但是在J8中表示未使用参数的替代方法是什么?这根本不可能吗?我们目前使用
$
来实现这一目的。我现在使用Java 14,仍然不能使用下划线作为未命名的lambda参数。不管JCP打算实现什么,似乎他们实现了相反的目标。@Frans注意到JEP(截至今天)只处于候选阶段。它还没有完成。有关JEP流程的更多详细信息,请参阅