2012-04-03 6 views
10

У меня есть два вопроса, Actaully ... Во-первых, Почему я не могу это сделать:Список <Object> и Список <?>

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

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

Спасибо!

+0

Хорошо, если вы, ребята, говорите, что 'List ' не может быть инстанцирован, тогда как это может вернуть метод? – Chris

+0

Стоит отметить, что 'Arrays.asList (T ... a)' возвращает 'List '. Вы можете инициализировать 'List' с помощью' List li = Arrays.asList (1, 2, "3"); 'для сохранения некоторой типизации, хотя возвращенный' List' будет фиксированным размером и будет поддерживаться массивом: https: //docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#asList(T ... –

ответ

28

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

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

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

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

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

У меня есть метод, который возвращает List<?>, как бы я перехожу, что в List<Object>

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

+0

Метод, который возвращает «Список », из внешней библиотеки, и я не могу добраться до код. Я просто знаю, что он использовал для возврата «Список », а затем они обновили код, и теперь он возвращает «Список », по существу разбивающий все мои кодировки. – Chris

+0

Ответ не соответствует второму аспекту вопрос. Как насчет примера? –

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

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

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

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

2

Список - это интерфейс, поэтому вы не можете его инициировать. Используйте любой из его реализаций, а не, например.

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

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

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

или

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

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

0

Чтобы ответить на ваш второй вопрос, да, вы можете бросить 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(); 
Смежные вопросы