使用 for List 更正泛型
Correct Generics using for List
我有下一个代码:
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 的泛型?
看起来你想要
public static <T extends Animal> List<T> doSomeWork(List<T> animals){
List<T> newAnimals = new ArrayList<>();
return newAnimals;
}
public static List<? extends Animal> doSomeWork(List<? extends Animal> animals){
List<? extends Animal> newAnimals = new ArrayList<>();
每次使用 ? extends Animal
时,都表示不同类型的“Animal
的子类”。因此,参数的类型、return 值的类型和局部变量的类型是不同的:您不能将 animals
中的内容添加到 newAnimals
中(反之亦然) ),并且您不能从方法中 return animals
或 newAnimals
。
此外,return 类型不是“特定动物类型的列表”,而是“特定 但未知 动物类型的列表”。你无法从中得到 List<Cat>
,你只能得到 List<? extends Animal>
。
如果你想表明它们是相同的,你需要声明一个类型变量,你在所有的声明中都使用它。
public static <T extends Animal> List<T> doSomeWork(List<T> animals){
List<T> newAnimals = new ArrayList<>();
这仍然是“Animal
的某个子类”,但它们都被 T
引用的事实意味着它们是 相同的 子类; returned 的类型与您传入的类型相同。
是这样做的:
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;
}
我不喜欢这种转换...但它有效
我有下一个代码:
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 的泛型?
看起来你想要
public static <T extends Animal> List<T> doSomeWork(List<T> animals){
List<T> newAnimals = new ArrayList<>();
return newAnimals;
}
public static List<? extends Animal> doSomeWork(List<? extends Animal> animals){
List<? extends Animal> newAnimals = new ArrayList<>();
每次使用 ? extends Animal
时,都表示不同类型的“Animal
的子类”。因此,参数的类型、return 值的类型和局部变量的类型是不同的:您不能将 animals
中的内容添加到 newAnimals
中(反之亦然) ),并且您不能从方法中 return animals
或 newAnimals
。
此外,return 类型不是“特定动物类型的列表”,而是“特定 但未知 动物类型的列表”。你无法从中得到 List<Cat>
,你只能得到 List<? extends Animal>
。
如果你想表明它们是相同的,你需要声明一个类型变量,你在所有的声明中都使用它。
public static <T extends Animal> List<T> doSomeWork(List<T> animals){
List<T> newAnimals = new ArrayList<>();
这仍然是“Animal
的某个子类”,但它们都被 T
引用的事实意味着它们是 相同的 子类; returned 的类型与您传入的类型相同。
是这样做的:
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;
}
我不喜欢这种转换...但它有效