[英]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.