这是一个语义问题(以及相当迂腐的语义)。
考虑一个NormalAnnotation
,例如@SuppressWarnings(value={"foo","bar"))
,其中SuppressWarnings
(TypeName)解析为具有名为 的成员的注释类value
。
现在考虑一个SingleElementAnnotation
,例如@SuppressWarnings({"foo","bar"))
。Identifier ( SuppressWarnings
)是接口的名称,但没有任何内容表明应将一个参数分配给value
。
因此,您不能直接将该字符序列解析为NormalAnnotation
; 它没有正确格式的ElementValuePairs
. 但是,如果您value=
在左括号和参数开头之间插入 , ,那么您将得到可解析为 NormalAnnotation 的内容。
MarkerAnnotation 也是如此。它缺少 NormalAnnotation 所需的括号。
Identifier 必须是在 NormalAnnotation 中使用时会产生 TypeName 的值。
NormalAnnotation 对其有很多限制,例如:
如果 TypeName 未命名在使用注释时可访问的注释类型(第 6.6 节),则这是编译时错误。
直到 SingleElementAnnotation 或 MarkerAnnotation 转化为 NormalAnnotation 之前,SuppressWarnings
它只是一个 Identifier,只需要符合Identifier的定义即可。请注意,TypeNames 可以被限定,例如java.lang.SuppressWarnings
,但 Identifiers 不能。
我相信其意图是 MarkerAnnotation 和 SingleElementAnnotation 应该使用简单名称(标识符)而不是完全限定名称(类型名称)。所以从技术上讲@Override
是可以的,@java.lang.Override
是不正确的,但@java.lang.Override()
会被允许。我可以使用的每个编译器都允许后者。这使得几乎每个人的区别都没有实际意义。