Как правильно аннотировать методы с помощью общих коллекций, используя внешние аннотации Eclipse
Я пытаюсь аннотировать метод java.util.List.toArray
используя внешние аннотации Eclipse, но я не уверен, как аннотировать возвращаемый тип. Если мой список имеет следующую подпись:
@NonNull List<@NonNull Element>
List.toArray должен вернуть:
@NonNull Element @NonNull[]
Однако, если список может содержать обнуляемые элементы:
@NonNull List<@Nullable Element>
List.toArray также должен возвращать массив с обнуляемыми элементами:
@NonNull Element @Nullable[]
Я использую Eclipse Neon, это вообще возможно? Страница Eclipse Neon New and Noteworthy, кажется, предоставляет пример для List.get() и предлагает, чтобы я пропустил нулевое значение для значения, но это не работает для массивов? Вот определение внешней аннотации, которое я использую:
class java/util/List
toArray
<T:Ljava/lang/Object;>([TT;)[TT;
<T:Ljava/lang/Object;>([T1T;)[T1T;
Но это не работает:
@NonNull
List<@NonNull String> collect = // works
@NonNull
String @NonNull [] array = collect.toArray(new String[0]);
collect.toArray
помечен как ошибка:
Безопасность нулевого типа (аннотации типов): для выражения типа 'String[]' требуется непроверенное преобразование для соответствия '@NonNull String []'
Как я могу это исправить? Это работает даже с Eclipse Neon, пока?
1 ответ
Я нашел этот совет и последовал ему в Eclipse 2020-03: я поместил курсор между «T» и «[]» возвращаемого типа, открыл контекстное меню и выбрал «Аннотировать как не нуль». Это имело желаемый эффект, как если бы метод был объявлен
@NonNull <T> T[] toArray(T[] a)
Сгенерированный файл List.eea выглядит следующим образом:
class java/util/List
toArray
<T:Ljava/lang/Object;>([TT;)[TT;
<T:Ljava/lang/Object;>([TT;)[1TT;