Java 子父类型集合之间的转换

假设现在有这样一个方法,入参是父类型的集合参数,这是个通用方法,你需要共用它,你现在要传子类型集合进去,怎么办?

class Animal { }

class Dog extends Animal { }

public class Service {
    public void doSth() {
        List<Animal> animals = new ArrayList<>();
        handleData(animals);

        List<Dog> dogs = new ArrayList<>();
        handleData(dogs); // 这里如何不报错?
    }
    
    public void handleData(List<Animal> animals) {
        // ...
    }
}

直接传是不行的,会报错。有三种办法。

1、使用泛型通配符

pubic void handleData(List<? extends Animal> animals) { }

为什么这样可以?你先理解List<?>List<Object>的区别。List<?> 是一个未知类型的List,而List<Object> 是已知的但是任意类型的List。你可以把List<String>, List<Integer>赋值给List<?>,却不能把List<String>赋值给 List<Object>

List<? extends Animal>也是这个道理,它也是未知类型的,只是限定了类型上限。

2、使用泛型方法

public <T extends Animal> void handleData(List<T> animals) { }

3、最简单的办法

public void doSth() {
    List<Dog> dogs = new ArrayList<>();
    List<Animal> animals = new ArrayList<>(dogs);
    handleData(animals);
}
posted @ 2023-08-17 23:34  xfcoding  阅读(172)  评论(0编辑  收藏  举报