2015-09-01 2 views
2

Для следующей подписи:Где ссылается @Nullable аннотация в случае параметра varargs?

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

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

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

+1

Аннотации типа добавлены в Java 8 как часть JSR 308. – Tunaki

ответ

8

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

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

@Nullable ElementType [] 

объявляет массив @Nullable ElementType, читать NULLABLE элементов, тогда как

ElementType @Nullable [] 

Объявить тип массива с нулевым значением.

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

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. Затем, чтобы обеспечить соблюдение описанной семантики, вам понадобится обновленная реализация фреймворка checker, совместимая с аннотациями типа Java 8.

+1

Различие также описано здесь (посредством синтаксиса массива): http://help.eclipse.org/mars/index.jsp?topic= % 2Forg.eclipse.jdt.doc.user% 2Ftasks% 2Ftask-using_null_type_annotations.htm & ф = 1_3_9_1_3 & якорь = совместимость –