Чтобы ответить на ваш второй вопрос, да, вы можете бросить List<?>
как List<Object>
или List<T>
любого типа, так как параметр ?
(Wildcard) указывает на то, что список содержит однородную коллекцию с любойObject
. Тем не менее, нет никакого способа узнать при компиляции, что такое type
, так как он входит только в экспортированный API - это означает, что вы не можете видеть, что вводится в List<?>
.
Вот как вы сделали бы бросок:
List<?> wildcardList = methodThatReturnsWildcardList();
// generates Unchecked cast compiler warning
List<Object> objectReference = (List<Object>)wildcardList;
В этом случае вы можете проигнорировать это предупреждение, потому что для того, чтобы объект, который будет использоваться в обобщенном классе он должен быть подтипом Object
. Давайте притворимся, что мы пытаемся сделать это как List<Integer>
, когда он действительно содержит коллекцию String
s.
// this code will compile safely
List<?> wildcardList = methodThatReturnsWildcardList();
List<Integer> integerReference = (List<Integer>)wildcardList;
// this line will throw an invalid cast exception for any type other than Integer
Integer myInteger = integerRefence.get(0);
Помните: общие типы стираются во время выполнения. Вы не будете знать, что содержит коллекция, но вы можете получить элемент и вызвать .getClass()
, чтобы определить его тип.
Class objectClass = wildcardList.get(0).getClass();
Хорошо, если вы, ребята, говорите, что 'List >' не может быть инстанцирован, тогда как это может вернуть метод? – Chris
Стоит отметить, что 'Arrays.asList (T ... a)' возвращает 'List'. Вы можете инициализировать 'List' с помощью' List