当超类被定义为返回类型时返回子类

时间:2014-11-19 13:13:06

标签: java list data-structures extends

在有关同一主题的问题的扩展中: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;

所以问题不在于如何使这项工作,但为什么它不起作用。 列表狗是包含动物的列表,因为狗是动物,对吗?

1 个答案:

答案 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}}。