这是合法的:
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/