1

几天前我在写一个简单的Java程序,我发现这段代码不起作用(它给出了一个编译时错误):

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

其中 Document 是一个接口,Book 实现 Document。

为什么 Java 中的继承不适用于泛型?如果我想让该代码工作,我必须使用通配符,如下所示:

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

我想知道这是什么原因?如果我需要一个 ArrayList of Documents,并且我知道 Book 也是一个 Document,为什么我不能将 Books 的 ArrayList 用作 Documents 的 ArrayList?

4

2 回答 2

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.

如果您想了解有关此问题的更多概念背景材料,请阅读协变和逆变

于 2013-06-16T09:06:37.977 回答
5

只是因为类型List<U>不能是类型的子类型List<V>(除非 U = V)。

在此处输入图像描述

例如,如果您承认那List<Integer>List<Number>. 您可以编写以下内容:

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

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

这里有什么问题 ?

于 2013-06-16T09:06:33.777 回答