这是一个语义问题(而且是相当迂腐的语义)。
考虑NormalAnnotation,例如@SuppressWarnings(value={"foo","bar")),其中SuppressWarnings(TypeName)解析为具有名为value的成员的注释类。
现在考虑SingleElementAnnotation,例如@SuppressWarnings({"foo","bar"))。标识符 (SuppressWarnings) 是 接口的名称,但没有任何说明应该将一个参数分配给 value。
因此,您不能直接将该字符序列解析为NormalAnnotation;它没有正确格式的ElementValuePairs。但是,如果您在左括号和参数开头之间插入value=,那么您会得到可解析为 NormalAnnotation 的内容。
MarkerAnnotation 也是如此。它缺少 NormalAnnotation 所需的括号。
标识符必须是在 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() 是允许的。我可以使用的每个编译器都允许后者。这使得几乎每个人的区别都没有实际意义。