Как правильно аннотировать методы с помощью общих коллекций с помощью внешних аннотаций Eclipse

Я пытаюсь аннотировать метод java.util.List.toArray, используя внешние аннотации Eclipse, но я не уверен, как аннотировать возвращаемый тип. Если мой Список имеет следующую подпись:

@NonNull List<@NonNull Element>

List.toArray должен вернуть:

@NonNull Element @NonNull[]

Если, однако, список может содержать элементы, допускающие значение NULL:

@NonNull List<@Nullable Element>

List.toArray также должен возвращать массив с элементами, допускающими значение NULL:

@NonNull Element @Nullable[]

Я использую Eclipse Neon, возможно ли это вообще? Кажется, что новая и заслуживающая внимания страница Eclipse Neon является примером для 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?


person looper    schedule 19.07.2016    source источник
comment
toArray возвращает тот же тип, который вы передаете в качестве параметра, а new String[0] не имеет аннотации @NonNull. Но обратите внимание, что нет никакой связи между типом массива и типом элемента Collection, например вы даже можете написать String[] array = collect.toArray(new String[0]);, когда collect имеет тип List<Integer>. Это сработало бы даже, если List пуст. Что касается нулевого значения, это потребует специальной обработки со стороны средства проверки, но обратите внимание, что контракт является особенным: если массив больше, чем размер коллекции, элемент массива, следующий за последним элементом, будет null исключен.   -  person Holger    schedule 19.10.2016


Ответы (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;
person Martin Rust    schedule 05.02.2021