我有以下类(class)。
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
的后代...
最佳答案
Basket<? extends Fruit>
并不意味着可以容纳任何物体的篮子,只要它是 Fruit
的子类型即可。这意味着某种未知类型的篮子T
延伸Fruit
。例如,它可能是 Basket<Apple>
,一个Basket<Orange>
或Basket<Fruit>
。因为它可能是 Basket<Orange>
,您不能将该项目设置为 Apple
.
Basket<Fruit>
一篮子Fruit
。任何水果都可以。
关于Java 泛型通配符边界无法设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29178446/