批注是否适用于声明语句中的所有变量?

2022-09-04 19:49:09

如果使用字段注释在单个语句中声明多个字段,则注释是否适用于所有字段?

例如,以下结果是否会导致 、 和 所有都具有注释?xyz@Nullable

@Nullable public Integer x, y, z;

我正在寻找这方面的官方规范,但很难找到一个。


答案 1

我认为我们能得到的最接近的是这个,从§8.3开始

FieldDeclaration:
  {FieldModifier} UnannType VariableDeclaratorList ;

VariableDeclaratorList:
  VariableDeclarator {, VariableDeclarator}

VariableDeclarator:
  VariableDeclaratorId [= VariableInitializer]

FieldModifier

FieldModifier:
  (one of)
  Annotation public protected private
  static final transient volatile 

(因此,批注是字段修饰符。

回到 §8.3:

通过使用多个声明器,可以在单个字段声明中声明多个字段;FieldModifiers 和 UnannType 适用于声明中的所有声明符

因此,换句话说,给定:

@Nullable public Integer x, y, z;

我们知道字段修饰符适用于所有 、 和 。@Nullable publicxyz

此外,阅读更多 §8.3 和 §9.74 将澄清,即使声明为类型注释(即):@Nullable@Target(ElementType.TYPE_USE)

注释可以出现在程序中的语法位置,在那里它可以合理地应用于声明和/或类型。这可能发生在五个声明上下文中的任何一个中,其中修饰符紧跟在声明实体的类型之前:

  • [...]

  • 字段声明(包括枚举常量)

  • [...]

Java 编程语言的语法明确地将这些位置的注释视为声明的修饰符 (§8.3), [...]。

换句话说,此类位置中的注释在语法上始终被视为字段修饰符,即使它不被视为声明注释(因为它不是用 ) 声明的。这在字段声明的语法中也有提示,其中类型被给出为,即未注释的类型@Target(ElementType.FIELD)UnannType


答案 2

是的,它们都有注释。

注释是 类型的修饰符,而不是 .所以所有的 、 都是类型Integerxxyz@Nullable Integer


推荐