Ответ 1
Я думаю, что самое близкое, что мы можем получить, это, начиная с §8.3:
FieldDeclaration: {FieldModifier} UnannType VariableDeclaratorList ; VariableDeclaratorList: VariableDeclarator {, VariableDeclarator} VariableDeclarator: VariableDeclaratorId [= VariableInitializer]
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.