У меня есть классИнстанцирование из родового объекта с групповым символом
public class OrderedBox<T> {}
Компилятор не позволяет создать члена/локальную переменную, как это.
OrderedBox<? extends T> testItems1 = new OrderedBox<? extends T>();
List<? extends T> testItems2 = new ArrayList<? extends T>();
Ее причина понятно во время выполнения, это не гарантирует тип объектов (верхний, ограниченный Т) будет вставлено и будет игнорировать типобезопасность.
Но это позволяет создавать переменную-член/локальную переменную, подобную этим. Почему и как это можно сделать?
private List<OrderedBox<? extends T>> testItems = new ArrayList<OrderedBox<? extends T>>();
Примечание: У меня есть это сомнение, проходя через http://www.onjava.com/pub/a/onjava/excerpt/javaian5_chap04/index1.html
Вероятные дублей:
Creating new generic object with wildcard
Generics wildcard instantiation
Но оба эти вопросы дают s аргументирование сбоя компиляции двух опций. Я не мог понять, почему и как разрешено последнее 1.
Два вопроса: какая версия Java вы используете, и почему вы не используете алмазный ''> оператор, который бы позаботился об этой проблеме? – Makoto
Первый ответ на указанную ссылку «Создание нового универсального объекта с помощью подстановочного знака» объясняет причину, по которой вы не разрешены в первый раз (потому что вы не говорите, для какого класса будет создан объект testItems1) и почему вам разрешено во второй раз (потому что вы сообщают, что список должен иметь тип OrderedBox) –
@Makoto, 1st: Java7. 2: Спасибо, <> решает. Но мой вопрос - почему он это разрешает? – arc