[英]Can Java generic merges 2 lists of different sub-class into one list of super class?
假设我有动物类,而猫和狗是其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可以做到吗?
只需省略通配符,如下所示:
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]
试试这样:
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
,该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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.