Список <Объект> и Список <?>
У меня есть два вопроса, actaully...
Прежде всего, почему я не могу это сделать:
List<Object> object = new List<Object>();
И во-вторых, у меня есть метод, который возвращает List<?>
, как бы я превратил это в List<Object>
, мог ли я просто его использовать?
Спасибо!
Ответы
Ответ 1
Почему я не могу это сделать:
List<Object> object = new List<Object>();
Вы не можете этого сделать, потому что List
- это интерфейс, и интерфейсы не могут быть созданы. Только (конкретные) классы могут быть. Примеры конкретных классов, реализующих List
, включают ArrayList
, LinkedList
и т.д.
Вот как создать экземпляр ArrayList
:
List<Object> object = new ArrayList<Object>();
У меня есть метод, который возвращает List<?>
, как бы превратить это в List<Object>
Покажите нам соответствующий код, и я обновлю ответ.
Ответ 2
List<Object> object = new List<Object>();
Вы не можете этого сделать, потому что Список - это интерфейс, и вы не можете создать объект какого-либо интерфейса или другим словом, вы не можете создать какой-либо интерфейс. Кроме того, вы можете назначить любой объект класса, который реализует Список в своей ссылочной переменной. Например, вы можете сделать это:
list<Object> object = new ArrayList<Object>();
Здесь ArrayList - класс, который реализует Список, вы можете использовать любой класс, который реализует Список.
Ответ 3
Список - это интерфейс, поэтому вы не можете его инициировать. Используйте любые его реализации, например,
List<Object> object = new List<Object>();
О списке:
вы можете использовать любой объект в качестве общего параметра для экземпляра:
List<?> list = new ArrayList<String>();
или
List<?> list = new ArrayList<Integer>();
При использовании List<Object>
это объявление недопустимо, потому что оно будет иметь тип missmatch.
Ответ 4
Чтобы ответить на ваш второй вопрос, да, вы можете использовать List<?>
как List<Object>
или List<T>
любого типа, так как параметр ?
(подстановочный знак) указывает, что список содержит однородную совокупность a 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();