java - 将子类添加到java中的通配符类型的泛型集合

标签 java generics

这是合法的:

List<? extends Animal> animals = getMonkeys();
...
List<Monkey> getMonkeys(){
    ...
}

以下会导致编译器错误:

animals.add(new Donkey());

为什么?如何合法地添加子类型?

最佳答案

编译器不知道通配符可能是哪个子类。它可能是 List<Fish>尽其所知。为了保持类型安全,编译器必须阻止对 add 的调用, 因为不应该允许添加 Monkey什么可能是List<Fish> .

List<? extends Animal> animals = new ArrayList<Fish>();  // legal
animals.add(new Monkey());  // unsafe; compiler error
animals.add(new Donkey());  // also unsafe; compiler error

为防止这种情况,您需要消除变量中的通配符,以便编译器知道泛型类型参数。 List<Animal>List<Monkey> (或 List<Donkey> 视情况而定)将允许您调用 add参数不是null .如果您必须调用 getMonkeys() , 那么你必须使用它的返回类型 List<Monkey> .

List<Monkey> monkeys = getMonkeys();
monkeys.add(new Monkey());

关于java - 将子类添加到java中的通配符类型的泛型集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24146505/

相关文章:

Java 哈希值 : how to make them efficiently comparable?

java - Android-配置文件

c# - 返回未知数据类型

java - 为什么强制转换 Object[] 数组是错误的?

C# 泛型 : Defining only one type as generic

java - 无法从 Jersey 响应中获取正确的 json 值

java - 如何在 JTable 中创建翻转效果?

java - 如何使用Java获取和放置Excel的列名称?

c# - 无法将类型 'T' 隐式转换为 'T

java - 如何使用泛型找到最大数量?