java - 为什么不允许这样使用泛型和通配符?

标签 java generics wildcard super

这段代码

static void writeTo(List<? super Apple> apples) {
        apples.add(new Apple());
        apples.add(new Jonathan());
    }

这段代码的作者声明

The argument apples is a List of some type that is the base type of Apple; thus you know that it is safe to add an Apple or a subtype of Apple. Since the lower bound is Apple,

Jonathan 是 Apple 的子类。

但是当我尝试这个的时候

    List<Jonathan> loj = new ArrayList<Jonathan>();
    listSuper(loj);

它给了我这个错误

The method listSuper(List<? super Apple>) in the type Basket<T> is not applicable for the arguments (List<Jonathan>)

listSuper 看起来像这样

static void listSuper (List<? super Apple> cont) {}

两者有何不同?

此外,让我对我发布的第一个代码感到困惑的是 我想 ? super T 的意思是T的任意基类型。但是从表面上看,他添加了T的子类型。我很困惑。

最佳答案

List<? super Apple>表示 List你可以添加一个Apple到(并且由于 Jonathan 是一个 Apple ,您也可以将 Jonathan 放入该类型的 List 中)。

可以是List<Apple> , List<Fruit>List<Object> , 但不是 List<Jonathan> ,因为你不能随意放置 Apple进入List<Jonathan> .如您所见,在本例中为 ?可以是 Apple或其任何父类(super class)。

List<? extends Apple>表示 List你可以获得Apple从。可以是List<Apple>List<Jonathan> , 但不是 List<Fruit> , 自 List<Fruit>不保证只包含 Apple

这个解释被称为“生产者 - extends,消费者 - super”规则:如果参数作为元素的消费者,它应该用 super 声明。 ,反之亦然。

关于java - 为什么不允许这样使用泛型和通配符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12301670/

相关文章:

Long.numberOfTrailingZeros() 的 Java 实现

scala - 如何将类型限制为 Scala 中的特定类型

c# - 有没有一种方法可以用 Moq 来模拟 DbSet.Find 方法?

java - 泛型通配符参数下界到对象

regex - eclipse 搜索并替换为通配符

java - 使用过滤器解析 XML

java - mvn build 将构建内容输出到工作目录

java - 递归算法的运行时复杂性

c# - 共享通用代码以了解引用类型的原因和效率影响

visual-studio-2008 - 查找和替换的通配符用法