在有关同一主题的问题的扩展中:Is List<Dog> a subclass of List<Animal>? Why aren't Java's generics implicitly polymorphic? 我有一个后续问题。
鉴于你有课程 动物 - 父母 狗 - 孩子
为什么在将退货类型定义为列表时无法返回列表?
private class Animal{};
private class Dog extends Animal{};
public List<Animal> makeAnimalListOfDogs(Dog dog1, Dog dog2){
List<Dog> dogs = new List<Dog>;
dogs.add(dog1);
dogs.add(dog2);
return dogs;
}
这似乎是一个无用的例子,但它只是为了澄清问题。如果您尝试这样做,您将收到错误:
Type mismatch: cannot convert from List<Dog> to List<Animal>
通过以下代码段替换return dogs
List<Animal> animals = new ArrayList<Animals>();
animals.addAll(dogs)
return animals;
所以问题不在于如何使这项工作,但为什么它不起作用。 列表狗是包含动物的列表,因为狗是动物,对吗?
答案 0 :(得分:0)
请参阅John Skeet's answer与您自己相关的问题:
不,List<Dog>
不是List<Animal>
。考虑使用List<Animal>
可以做些什么 - 你可以添加任何动物......包括一只猫。现在,你可以逻辑地将一只猫添加到一窝幼犬吗?绝对不是。
// Illegal code - because otherwise life would be Bad
List<Dog> dogs = new List<Dog>();
List<Animal> animals = dogs; // Awooga awooga
animals.add(new Cat());
Dog dog = dogs.get(0); // This should be safe, right?
突然间你有一只非常迷茫的猫。
现在,您无法向Cat
添加List<? extends Animal>
,因为您不知道它是List<Cat>
。您可以检索一个值并知道它将是Animal
,但您无法添加任意动物。对于List<? super Animal>
,反之亦然 - 在这种情况下,您可以安全地添加Animal
,但您不知道从中检索到的内容,因为它可能是{ {1}}。