Посмотрите на этот простой код.
try (@Foo Stream<@Bar Baz> foo = blabla) { }
Мы знаем, что @Bar
аннотирует Baz
, а @Foo
аннотирует Stream
(я написал похожий пример здесь, скомпилируйте его онлайн! ).
А как насчет этого кода?
void whatever(@Foo String[] args) { }
Здесь у нас есть String[]
с аннотацией @Foo
(какой бы ни была аннотация, это не важно для этого вопроса).
У меня вопрос, это @Foo
с комментариями String
или String[]
?
Очень важно определить цель аннотации, поскольку иногда мы используем аннотации, такие как @NotNull
, для представления допустимых значений типа, а @NotNull List<String>
означает, что список, который никогда не является нулевым, содержит некоторые возможные нулевые строки; List<@NotNull String>
представляет список, который может быть нулевым, но члены никогда не равны нулю.
Возможный вариант использования: мне нужно, чтобы @NotNull
показывал, что args
не равно нулю, а другой @NotNull
, чтобы показать, что члены args
также не равны нулю? Мне нужно аннотировать их обоих одновременно. Если args
это java.util.List
, я могу использовать @NotNull List<@NotNull String>
. Но args
- это массив - и я не знаю, как аннотация влияет на тип args
.