Могут ли аннотации применяться ко всем переменным в заявлении декларации?

Если несколько полей объявлены в одном выражении с помощью аннотации полей, аннотация применяется ко всем полям?

Например, будет ли следующий результат в x, y и z имеющий @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:

Более чем одно поле может быть объявлено в одном поле FieldDeclaration, используя более одного декларатора; FieldModifiers и UnannType применяются ко всем объявлениям декларации.

Так в других словах, учитывая:

@Nullable public Integer x, y, z;

Мы знаем, что модификаторы @Nullable public применяются ко всем x, y и z.

Кроме того, чтение немного больше из §8.3, а также § 9.74 пояснит, что этот случай, даже если @Nullable объявлен как аннотация типа (т. @Target(ElementType.TYPE_USE)):

Аннотацию можно представить в синтаксическом расположении в программе, где она может быть правдоподобно применима к объявлению или типу или к тому и другому. Это может произойти в любом из пяти контекстов объявления, где модификаторы сразу предшествуют типу объявленного объекта:

  • [...]

  • Полевые декларации (включая константы перечисления)

  • [...]

Грамматика языка программирования Java недвусмысленно рассматривает аннотации в этих местах как модификаторы для объявления (§8.3), [...].

Другими словами, аннотация в таком местоположении всегда обрабатывается синтаксически как модификатор поля, даже если он не считается аннотацией объявления (потому что он не объявлен с помощью @Target(ElementType.FIELD)). Это также намекает на грамматику для объявлений полей, где тип задается как UnannType, т.е. Unannotated type.

Ответ 2

Да, у всех есть аннотация.

Аннотирование - это модификатор типа Integer, а не для x. Таким образом, все x, y, z являются типами @Nullable Integer