Куда относится аннотация @Nullable в случае параметра varargs?

Для следующей подписи:

public static String format(final String pattern, final @Nullable Object... arguments)

Куда относится аннотация @Nullable? К массиву или к его элементам? Есть ли возможность аннотировать оба варианта (массив/элементы)?

Существуют ли различия между Java 7 и Java 8 (аннотации типов)?


person Gustave    schedule 01.09.2015    source источник
comment
Аннотации типов были добавлены в Java 8 как часть JSR 308.   -  person Tunaki    schedule 01.09.2015


Ответы (1)


Поскольку стандартной аннотации @Nullable по-прежнему нет, вы используете аннотацию сторонней библиотеки, поэтому это зависит от того, как она объявлена. Аннотации до Java 8 не являются аннотациями типов, поскольку в более ранних версиях эта функция отсутствует. Следовательно, с помощью этих аннотаций вы всегда аннотируете параметр, а не его тип. Обычно это интерпретируется фреймворками как «параметр может быть null», который будет ссылкой на массив, хотя фреймворки могут специально обрабатывать varargs, но нет стандарта, предписывающего конкретное поведение.

Когда вы используете реальную аннотацию типа Java 8, то есть аннотацию с @Target(ElementType.TYPE_USE), результат лучше всего объясняется с помощью обычного объявления массива:

@Nullable ElementType  []

объявляет массив из @Nullable ElementType, считывает элементы, допускающие значение NULL, тогда как

ElementType  @Nullable []

объявить тип массива, допускающий значение NULL.

таким образом, декларация

public static String format(final String pattern, final @Nullable Object... arguments)

подразумевает, что элементов может быть null, тогда как

public static String format(final String pattern, final Object @Nullable... arguments)

объявляет, что ссылка на массив может быть null. Конечно, вы можете комбинировать их, чтобы объявить, что оба, элементы или сам массив могут быть null

public static String format(String pattern, @Nullable Object @Nullable ... arguments)

Как уже говорилось, для использования этих параметров вам нужен тип аннотации, который на самом деле объявлен как аннотация типа Java 8. Затем, чтобы применить описанную семантику, вам потребуется актуальная реализация фреймворка проверки, совместимая с аннотациями типа Java 8.

person Holger    schedule 01.09.2015
comment
Различие также задокументировано здесь (по синтаксису массива): help.eclipse.org/mars/ - person Stephan Herrmann; 06.09.2015