我有以下课程。
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的后代.
发布于 2015-03-21 02:08:10
Basket<? extends Fruit>并不意味着一个可以容纳任何对象的篮子,只要它是Fruit的一个子类型。它意味着一个未知类型的T扩展Fruit的篮子。例如,它可以是Basket<Apple>、Basket<Orange>或Basket<Fruit>。因为它可能是Basket<Orange>,所以不能将项目设置为Apple。
Basket<Fruit>是一篮子Fruit。任何水果都行。
https://stackoverflow.com/questions/29178446
复制相似问题