假设现在有这样一个方法,入参是父类型的集合参数,这是个通用方法,你需要共用它,你现在要传子类型集合进去,怎么办?
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) {
// ... handle data
}
}
直接传是不行的,会报错。有三种办法。
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);
}
标签:Java,handleData,void,List,new,集合,animals,子父,public
From: https://www.cnblogs.com/cloudrich/p/17639213.html