使用 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 animalsnewAnimals

此外,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;
}

我不喜欢这种转换...但它有效