我有下一個代碼:
class Cat extends Animal{}
List<Cat> oldCats = getCats();
List<Cat> newCats = doSomeWork(oldCats);
public static List<? extends Animal> doSomeWork(List<? extends Animal> animals){
List<? extends Animal> newAnimals = new ArrayList<>();
for(Animal a : animals){
newAnimals.add(a);
}
return newAnimals;
}
我有編譯錯誤,所需的型別不正確。
Required type:List<Cat>
Provided:List<capture of ? extends Animal>
如何正確調整 List 的泛型?
uj5u.com熱心網友回復:
public static List<? extends Animal> doSomeWork(List<? extends Animal> animals){
List<? extends Animal> newAnimals = new ArrayList<>();
每次使用 a? extends Animal時,它都表示不同型別的“某物是Animal”的子類。所以,引數的型別、回傳值的型別和區域變數的型別是不同的:你不能從animalsinto中添加東西newAnimals(反之亦然),你也不能從方法中回傳或者animals回傳newAnimals。
此外,該回傳型別不是“特定型別動物的串列”,而是“特定但未知型別動物的串列”。你不能從中得到List<Cat>回報,你只能得到一個List<? extends Animal>。
如果你想表明它們是相同的,你需要宣告一個型別變數,你在所有的宣告中都使用它。
public static <T extends Animal> List<T> doSomeWork(List<T> animals){
List<T> newAnimals = new ArrayList<>();
這仍然是“某個子類Animal”,但事實上它們都是通過T它們是同一個子類來參考的;并且回傳的型別與您傳入的型別相同。
uj5u.com熱心網友回復:
看起來你想要
public static <T extends Animal> List<T> doSomeWork(List<T> animals){
List<T> newAnimals = new ArrayList<>();
return newAnimals;
}
uj5u.com熱心網友回復:
這樣做是這樣的:
public static <T extends Animal> List<T> doSomeWork(List<T> animals){
List<T> newAnimals = new ArrayList<>();
for (T a : animals){
Animal castedAnimal = (Animal)a;
newAnimals.add(a);
}
return newAnimals;
}
我不喜歡這個選角……但它有效
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/437851.html
上一篇:Jackson解碼泛型型別
下一篇:Java中泛型的向下轉換
