List <是什么参数?超级X>和List <?在调用list.add(E e)时扩展X>接受吗?

时间:2019-06-19 19:14:00

标签: java generics bounded-wildcard

因此,在尝试理解我的代码为何编译时遇到了困难。我试图了解JAVA中的有界通配符,并且偶然发现了这个问题What is a difference between <? super E> and <? extends E>?

如上面问题的答案和Oracle的JAVA通配符文档所述,据说这意味着“?”。必须是X本身或X的子类。这意味着“ X”必须是X本身或?的子类。

假设我们有两个类:

class Book
class SmallBook extends Book

和声明如下的列表:

List<? super Book> allBooks = new ArrayList<>();

现在,当我在列表中添加SmallBook对象时,它将进行编译。

books.add(new SmallBook("title"));
books.add(new Book("title"));

Book不应该是“?”的子类,在这种情况下,“ SmallBook”是否有意义?!

另一种情况是当我使用扩展而不是超级时:

List<? extends Book> allBooks = new ArrayList<>();
books.add(new SmallBook("title"));
books.add(new Book("title"));

在这种情况下,代码不会编译。为什么呢? SmallBook不是Book的子类,因此不应该作为参数接受吗?

0 个答案:

没有答案