Список <Объект> и Список <?>

У меня есть два вопроса, 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();