说我有动物班,猫和狗作为2个子类。
我想在一个Java方法中返回两个宠物的列表。所以我尝试了以下内容:
public List<? extends Animal> getAllPets(...) {
List<? extends Animal> allDogs = findAnimals(...someOtherArgs, Dog.class);
List<? extends Animal> allCats = findAnimals(...someOtherArgs, Cat.class);
List<? extends Animal> retObjs = allDogs;
retObjs.addAll(allCats); // won't compile
return retObjs;
}
可以在Java中这样做吗?
尝试这样的方式:
public List<? extends Animal> getAllPets(...) {
List<Dog> allDogs = findDogs();
List<Cat> allCats = findCats();
List<Animal> retObjs = new ArrayList<>(allDogs.size() + allCats.size());
retObjs.addAll(allDogs);
retObjs.addAll(allCats);
return retObjs;
}
只需省略通配符,就这样:
List<Integer> a = Arrays.asList(1);
List<Double> b = Arrays.asList(1.0);
List<Number> c = new ArrayList<>();
c.addAll(a);
c.addAll(b);
System.out.println(c);
以上编译并运行良好,打印
[1,1.0]
多态性允许您存储List
中任何子类的所有实例,该实例被声明为存储BaseClass
对象的列表。因此,在您的情况下,您需要声明List<Animal>
,现在您可以在此处存储任何Cat
或Dog
。
无需在代码中使用 ?
。将它们删除为以下代码:
public List<? extends Animal> getAllPets(...) {
List<Animal> allDogs = findDogs();
List<Animal> allCats = findCats();
List<Animal> retObjs = allDogs;
retObjs.addAll(allCats); // won't compile
return retObjs;
}