因此,在尝试理解我的代码为何编译时遇到了困难。我试图了解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的子类,因此不应该作为参数接受吗?