Как правильно аннотировать методы с помощью общих коллекций, используя внешние аннотации 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;
Другие вопросы по тегам