新的Java 8+分隔符(标点符号) - 如何/在哪里使用?

4
Java 8的JLS引入了三个新的分隔符
...   @   ::

省略号(...)用作“方法或构造函数的最后一个形式参数”。但是,Java 7的JLS已将此形式参数描述为“可变数量参数”。它没有被提及为分隔符。
分隔符::用于形成方法引用表达式@意味着“将注释类型声明与普通接口声明区分开来”,因此是注释类型声明的一部分。注释已经是Java 7 JLS的一部分。我看不到其他使用“at-sign”的用途。
搜索有关Java 8+分隔符的问题和答案,我找不到任何解释新分隔符用法的内容。
这两个分隔符...@分别代表什么?它们如何使用?
2个回答

3
首先,正如您所指出的那样,... 已经存在于Java 7中。(我认为它是在Java 5中引入的!)但是在Java 8中,它们明确将其列为“分隔符”之一。
我认为这并没有什么实际意义。这只是一个编辑上的修正。
两个分隔符... @不会真正地分隔任何东西。它们被归类为“分隔符”,因为它们不是运算符、字面值、标识符或关键字。
注:
1. 在JLS 11第3.1节中,规范定义了另一个术语“标点符号”。虽然不太好看,但更准确。 2. JLS区分分隔符是否分隔开并没有什么用处。术语“分隔符”在规范的其他部分几乎没有使用过,并且肯定不会在任何暗示分隔的上下文中使用。 3. “分隔符”不分隔也有先例。现有的标记( ) { } [ ]也没有真正起到分隔作用。它们的目的是开始或结束构造。 4. < > 标记也有些奇怪。词法语法将它们称为运算符,但在某些上下文中它们充当(松散的)分隔符。
不要对此过于解读。

我也在考虑“编辑更正”。但是说实话,我无法想象...会被错过多年和几个Java版本。 - LuCio
想象力是一件有趣的事情。请查看Java 7 JLS中的“词法语法”章节。...标记根本没有被提及。但显然,就编译器而言,它确实存在...就第8章而言也是如此。JLS中包含错误,其中一些是较小的(例如此处),而另一些则更为重要。 - Stephen C
3
请注意,最后一章包含了完整的语法规则,使用...@作为Java语言的有效标记,即使它们没有被归类为分隔符。正如这个答案提到的那样,这种分类没有实际影响,就像“分隔符”和“操作符”之间的区别(::不也是一种操作符吗?)没有任何区别一样。 - Holger

0
你链接中的第一句话说:
这一章节规定了Java编程语言的词法结构。
这就是重点所在。它是对Java语言语法的(半正式)描述。我们在这里不谈论语义,只是"措辞"。描述Java编程语言语法中的不同元素。
public foo(Bar... vararg)中,你可以这样说:
- (将方法名与参数列表分开 - ...将参数类型与参数名分开
要理解为什么将...列为分隔符,可能需要深入研究Java源代码解析的过程。也就是说,这个术语是根据解析器处理...的方式而来,并不一定具有语义上的意义。

我也考虑过在参数声明中使用 ... 作为分隔符。在注解类型声明中,@ 也可以被视为分隔符。它将潜在的修饰符与关键字 interface 分开。但是,这些分隔符对于 Java 8 并不新颖,这让人感到困扰。 - LuCio
就像所说的:我认为你试图在一个纯语法结构中寻找(语义上的)意义。这就像试图通过向她解释你这个星期实际上已经把垃圾倒了三次来解决与你配偶的冲突。但这并不是在她告诉你“你从来没有倒过垃圾”之后帮助她的关键点;-) - GhostCat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接