it-roy-ru.com

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

У меня два вопроса, на самом деле .... Во-первых, почему я не могу сделать это:

List<Object> object = new List<Object>();

И во-вторых, у меня есть метод, который возвращает List<?>, как бы превратить его в List<Object>, смогу ли я просто привести его? 

Спасибо!

17
Chris

Почему я не могу сделать это:

List<Object> object = new List<Object>();

Вы не можете сделать это, потому что List является интерфейсом, и интерфейсы не могут быть созданы. Только (конкретные) классы могут быть. Примеры конкретных классов, реализующих List, включают в себя ArrayList , LinkedList и т.д.

Вот как можно создать экземпляр ArrayList:

List<Object> object = new ArrayList<Object>();

У меня есть метод, который возвращает List<?>, как бы я превратил это в List<Object>

Покажите нам соответствующий код, и я обновлю ответ.

35
NPE
List<Object> object = new List<Object>();

Вы не можете сделать это, потому чтоListявляется интерфейсом, и вы не можете создать объект любого интерфейса или в другом Word вы не можете создать экземпляр любого интерфейса. Более того, вы можете назначить любой объект класса, который реализует List его ссылочной переменной. Например, вы можете сделать это: 

list<Object> object = new ArrayList<Object>();

ЗдесьArrayListэто класс, который реализуетList, вы можете использовать любой класс, который реализуетList

4
Chandra Sekhar

Список - это интерфейс, поэтому его нельзя создать. Вместо этого используйте любую из его реализаций, например,.

List<Object> object = new List<Object>();

О списке: Вы можете использовать любой объект в качестве общего параметра для своего экземпляра:

List<?> list = new ArrayList<String>();

или же

List<?> list = new ArrayList<Integer>();

При использовании List<Object> это объявление недопустимо, поскольку оно будет содержать несоответствие типов.

2
Alex Stybaev

Чтобы ответить на ваш второй вопрос, да, вы можете привести List<?> в качестве List<Object> или List<T> любого типа, поскольку параметр ? (подстановочный знак) указывает, что список содержит однородную коллекцию any Object. Однако при компиляции невозможно узнать, что такое type, так как он является частью только экспортируемого API, то есть вы не можете видеть, что вставляется в List<?>.

Вот как бы вы сделали бросок:

List<?> wildcardList = methodThatReturnsWildcardList();
// generates Unchecked cast compiler warning
List<Object> objectReference = (List<Object>)wildcardList;

В этом случае вы можете игнорировать предупреждение, потому что для использования объекта в универсальном классе он должен быть подтипом Object. Давайте представим, что мы пытаемся преобразовать это как List<Integer>, когда оно фактически содержит коллекцию Strings.

// 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();
0
Ian R. O'Brien