Java Generics通配符绑定无法设置

时间:2015-03-21 02:03:13

标签: java generics

我有以下课程。

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类型有效,我看不出这两种情况之间有什么区别,因为AppleFruit的后代......

1 个答案:

答案 0 :(得分:1)

Basket<? extends Fruit>并不意味着只要它是Fruit的子类型就可以容纳任何对象的篮子。它表示一个未知类型的T一个延伸Fruit的篮子。例如,它可以是Basket<Apple>Basket<Orange>Basket<Fruit>。由于它可能是Basket<Orange>,因此您无法将该项设置为Apple

Basket<Fruit>是一篮Fruit。任何水果都可以。