2013-02-18 1 views
1
List<Object> list = new ArrayList<String>() 

Когда я использую выше строка компилятор дает мне несоответствие типов ошибок. Но поскольку я понимаю, что Object - это суперкласс String, и если я создаю список объектов, тогда он также должен принять String. Поэтому почему вышеприведенное утверждение неверно. Я ищу объяснение.Почему Список <Object> список = новый ArrayList <String>() это дает TypeMismatch ошибке

+2

Нет. Тип в общем случае не работает. Вы можете сделать это с помощью 'List list = new ArrayList (); ', но он неприменим (может' get() ', но не может' add() '). – nhahtdh

+0

Это сообщение, кажется, объясняет это довольно хорошо ... http://stackoverflow.com/a/12973616/828193 – user000001

+0

http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html – nhahtdh

ответ

6

Одно предложение, потому что

Универсальные типы не являются полиморфными

т.е., даже если java.lang.String является подтипом java.lang.Object полиморфизма не относится к родовым типам. Это относится только к типам коллекций. Таким образом,

List<Object> list = new ArrayList<String>(); //this isn't valid 
  List<Object> list = new ArrayList<Object>(); //valid 
List<? extends Object> list = new ArrayList<String>();//valid 

Why can't generic types be polymorphic?

0

Просто замените:

List<Object> list = new ArrayList<String>() 

с

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

или

List<Object> list = new ArrayList<Object>() 

Здесь важно, что вы работаете с тем же типом данных

Или вы можете также используйте

List<?> list = new ArrayList<Object>(); 
+1

Объявление 2-го способа с '' будет делать все методы, которые берут тип T из общего непригодным для использования, могут быть вызваны только методы, которые не связаны с T. – nhahtdh

1

Потому что вы определить, что возможно список может быть связан с.

Правильный путь будет

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

, который так же, как

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

0

Тип объявления переменной должны соответствовать типу, который вы передаете реального объекта тип. Если вы объявите List<Foo> foo, то что бы вы ни назначили для ссылки foo ДОЛЖЕН быть из типового типа. Не подтип <Foo>. Не supertype от <Foo>.

Simple Generic types are not polymorphic 

List<Parent> myList = new ArrayList<Child>() \\ Invalid

1

A супер тип B не означает List<A> супер тип List<B>. Если такое предложение будет выполнено, будет нарушена последовательность системы типов.Рассмотрим следующий случай:

// ! This code cannot pass compilation. 
List<String> list1 = new ArrayList<String>(); 
List<Object> list2 = list1; // Error 
// Previous conversion causes type contradiction in following statements. 
list2.add(new SomeOtherClass()); 
String v = list1.get(0); // list1.get(0) is not String! 

Вот почему List<Object> не должен быть супер тип List<String>.