java - 通配符和变异方法

标签 java generics collections wildcard

当看到这个片段时,我完全困惑了:

class Animal {}

class Dog extends Animal {}

public class Test {

    public static void main(String[] args) {
        List<? super Animal> list = new ArrayList<>();
        list.add(new Dog());  //it's OK
        list.add(new Animal()); //and this is OK too
    }
}

为什么允许这样的事情?当我将列表更改为List<? super Dog> list = new ArrayList<>();时编译时错误发生在 list.add(new Animal());extends通配符所有组合都会导致错误。谁能说出这种行为的确切原因?提前致谢。

最佳答案

    List<? super Animal> list = new ArrayList<>();
    list.add(new Dog());  //it's OK
    list.add(new Animal()); //and this is OK too

上面的代码应该是允许的: 因为狗也是一种动物。

    List<? super Dog> list = new ArrayList<>();
    list.add(new Dog());  //it's OK
    list.add(new Animal()); //error

上面的代码是一个错误,它应该再次出现, 因为并非所有动物都是狗。

继承就这么简单。 :)

注意:为了完成答案,我引用了这个 super 好的答案:

[Difference between <? super T> and <? extends T> in Java 1

关于java - 通配符和变异方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28747956/

相关文章:

java - 仅在特定代码块中验证模拟调用,忽略其他调用

c# - 泛型的问题

C++如何创建一个自动转换图?

.net - NameValueCollection 上的属性 Keys 和 AllKeys 之间有什么区别?

java - 如何在 Intent 中插入 fragment (Android)

Java 虚拟机的字节序

DbSet<something> 的 C# 泛型

java - 如何获取 Map.values 作为 Set 而不是 Collection?

具有 set() 方法和 O(1) Contains() 的 Java 数据结构

java - 如何在 Java 中使用 Hamcrest 来测试异常?