繁体   English   中英

Java泛型能否将2个不同子类的列表合并为一个超类列表?

[英]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> ,现在您可以在此处存储任何CatDog

不需要使用? 在您的代码中。 将其删除为以下代码:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM