Java通用可以将不同的子类列表合并为超级类列表

  • 本文关键字:列表 合并 子类 Java java generics
  • 更新时间 :
  • 英文 :


说我有动物班,猫和狗作为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>,现在您可以在此处存储任何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;

}

相关内容

  • 没有找到相关文章

最新更新