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