Java 将超类定义为返回类型时返回子类
关于同一主题的问题的延伸: 我有一个后续问题 既然你有课 动物亲本 狗儿 当您将返回类型定义为列表时,为什么不能返回列表Java 将超类定义为返回类型时返回子类,java,list,data-structures,extends,Java,List,Data Structures,Extends,关于同一主题的问题的延伸: 我有一个后续问题 既然你有课 动物亲本 狗儿 当您将返回类型定义为列表时,为什么不能返回列表 private class Animal{}; private class Dog extends Animal{}; public List<Animal> makeAnimalListOfDogs(Dog dog1, Dog dog2){ List<Dog> dogs = new List&l
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;
}
所以问题不在于如何让它工作,而在于它为什么不工作。
犬类列表是一个包含动物的列表,因为犬类是动物,对吗?请查看您链接到自己的问题:
不,列表不是列表。考虑一下你可以用一个列表来做什么,你可以添加任何动物。包括一只猫。现在,你能在一窝小狗中添加一只猫吗?绝对不是
// 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?
突然你有一只非常困惑的猫
现在,你不能将猫添加到列表中。这个问题与你链接到的问题有何不同?请参阅John Skeet对你链接到自己的问题的回答。如果你不理解这个答案,你应该在你的问题中明确你有什么问题。不,列表不是列表。考虑一下你可以用一个列表来做什么,你可以添加任何动物。包括一只猫。现在,你能在一窝小狗中添加一只猫吗?绝对不是。约翰·斯基特
List<Animal> animals = new ArrayList<Animals>();
animals.addAll(dogs)
return animals;
// 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?