2013-06-16 3 views
1

Несколько дней назад я писал простую программу на Java, и я обнаружил, что этот кусок кода не работает (это дает ошибку во время компиляции):Наследование в Java генериков

ArrayList<Document> docs = new ArrayList<Book>(); 

где документ является интерфейсом и Book реализует документ.

Почему наследование в Java не работает с дженериками? Если я хочу, чтобы код работал, я должен использовать специальные символы, например:

ArrayList<? extends Document> docs = new ArrayList<Book>(); 

Я задавался вопросом, что является причиной этого? Если мне нужен ArrayList документов, и я знаю, что книга также является документом, почему я не могу использовать ArrayList of Books в качестве массива документов?

+0

http://stackoverflow.com/questions/10770585/why-polymorphism-doesnt -treat-generic-collections-and-plain-array-the-same-way –

+1

После того, как вы прояснили ответы о том, почему ваше первое утверждение не работает, см. [мой ответ на этот вопрос] (http: /stackoverflow.com/a/12605337/646634) для объяснения 'extends' и' super' и что они делают. – Brian

ответ

5

Это просто потому, что тип List<U> не может быть типом подтипа List<V> (за исключением U = V).

enter image description here

Если допустить, например, что List<Integer> является подтипом List<Number>. Вы можете написать следующее:

void addPi(List<Number> l) { 
l.add(3.14); 
} 

List<Integer> l = new LinkedList<>(); 
addPi(l); 

В чем проблема?

+0

Большое спасибо, я не думал, что могут возникнуть проблемы при добавлении новых элементов. – user2302436

7

рассмотрим следующий пример:

ArrayList<Book>books = new ArrayList<Book>(); 
ArrayList<Document> docs = new ArrayList<Book>(); 
docs.add(new Document()); 
Book book = books.get(0); //Oops, now we have a variable of type book, referring to a Document that is not a book. Not good. 

Если вы хотите более концептуальный справочный материал об этой проблеме читать на Covariance and Contravariance

+0

Большое спасибо, я не знал, что если я использую Я не могу добавлять элементы, а только читать их. – user2302436

Смежные вопросы