我有以下课程。
public class Basket<E> {
private E element;
public void setElement(E x) {
element = x;
}
public E getElement() {
return element;
}
}
class Fruit {}
class Apple extends Fruit {}
class Orange extends Fruit {}
当我考虑以下情况时,我的困惑就出现了。
Basket<? extends Fruit> basket = new Basket<>();
basket.setElement(new Apple()); // cannot set
和
Basket<Fruit> basket = new Basket<>();
basket.setElement(new Apple()); // okay!
如果? extends Fruit
表示我可以传递至少为Fruit
的内容(或任何实现或扩展的内容),为什么我无法传递Apple
类型?如果在第二种情况下传递Apple
类型有效,我看不出这两种情况之间有什么区别,因为Apple
是Fruit
的后代......
答案 0 :(得分:1)
Basket<? extends Fruit>
并不意味着只要它是Fruit
的子类型就可以容纳任何对象的篮子。它表示一个未知类型的T
一个延伸Fruit
的篮子。例如,它可以是Basket<Apple>
,Basket<Orange>
或Basket<Fruit>
。由于它可能是Basket<Orange>
,因此您无法将该项设置为Apple
。
Basket<Fruit>
是一篮Fruit
。任何水果都可以。