簡體   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