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

标签 java generics

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

最佳答案

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/

相关文章:

javascript - Bootstrap Validator 验证数字范围

Java - 如何将应急措施构建到调用 Web 服务的服务层中

django - 如何遍历 Django 模板中的反向泛型关系?

c# - 从类型创建泛型类的实例

java - 泛型:单个实例的?、对象和原始类型之间有什么区别?

java - JTable 自定义 TableCellRenderer 显示图像

java - LinearLayout 中屏幕末尾的 TextView

java - 我可以在 Java 中使用双键映射吗

Java 泛型接口(interface)与泛型方法,以及何时使用它们

java - monad 的一般情况可以在 java 6 中表达吗?