泛型存在这一些弊端:
例如A,B,C存在着继承的关系,我们希望方法只接收传递这些类型,但在实际开发中,泛型方法是可以做到接收任意的数据类型
所以这里引出泛型通配符的概念
泛型类型的限制:通配符可以限制泛型类型的范围。
例如:
使用通配符? extendsT可以限制泛型类型参数必须是T类型或其子类型
使用通配符? super T可以限制泛型类型参数必须是T类型或其父类型
此时是可以添加任意类型
public class demo5 {
public static void main(String[] args) {
ArrayList<ye> ye = new ArrayList<>();
ArrayList<fu> fu = new ArrayList<>();
ArrayList<zi> zi = new ArrayList<>();
ArrayList<student> students = new ArrayList<>();
method(ye);
method(fu);
method(zi);
method(students);
}
public static void method(ArrayList<?> list){}
}
class ye{}
class fu extends ye{}
class zi extends fu{}
class student{}
此时只可以添加ye类型以及它的子类
public static void method(ArrayList<? extends ye> list){}
此时只可以添加zi类型以及它的父类
public static void method(ArrayList<? super zi> list){}
应用场景:
- 如果我们在定义类、方法、接口的时候,如果类型不确定,就可以定义泛型类、泛型方法、泛型接口
- 如果类型不确定,但是能知道以后只能传递某个继承体系中的,就可以泛型的通配符
泛型的通配符;
关键点:可以限定类型的范围