Java 无法设置泛型通配符边界

Java Generics Wildcard bounding cannot set

我有以下 类.

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...

的后代

Basket<? extends Fruit>并不是说只要是Fruit的子类就可以装任何东西的篮子。它表示某种未知类型的篮子 T 延伸 Fruit。例如,它可以是 Basket<Apple>Basket<Orange>Basket<Fruit>。因为它可能是 Basket<Orange>,所以您不能将项目设置为 Apple

Basket<Fruit>是一筐Fruit。什么水果都行。