目录
一、什么是泛型
二、泛型方法
三、泛型接口
四、通配符
4.1、通配符
4.2、上限通配符
4.3、下限通配符
4.4、类型擦除
一、什么是泛型
泛型:就是指在类定义时不会设置类中的属性或方法参数的具体类型,而是在类使用时(创建对象)再进行类型的定义。会在编译期检查类型是否错误。
类声明后的<>中这个T被称为类型参数,用于指代任意类型,实际上这个T只是个代表,写什么都可以。表示此时的value1,value2都是在类定义时没有明确类型,只有在使用时才告知编译器类型。出于规范,类型参数用单个的大写字母来代替,常见如下:
- T:代表任意类
- E:表示Element的意思,或是异常
- K:与V搭配使用
- V:与K搭配使用
泛型的使用:
若此时value1和value2的类型不一定相同,就定义多个类型参数:
注意:非静态内部类会复用外部类的泛型参数,静态内部类不会复用外部类的泛型参数。
二、泛型方法
此处的泛型方法指的是有自己的类型参数
泛型方法始终以自己的类型参数为准,和类中的类型参数无关:
为了避免混淆,一般定义泛型方法时,尽量避免使用类中使用过的类型参数字母:
三、泛型接口
泛型接口:
子类在实现接口时有两种选择,①要么继续保留泛型,②要么定义子类时明确类型
①保留泛型
②定义子类时明确类型
四、通配符
4.1、通配符
<?> 一般用在方法参数,表示可以接受该类所有类型的泛型变量。
例如:
注意:<?>只能调用对象的getter方法来获取属性,由于此时根本无法确定传入对象的类型,因此无法调用对象的setter来设置值。
4.2、上限通配符
<? extends 类> 表示?可以指代任何类型,但是该类型必须是后面类的子类。
例如:
此时表示?<=Number,此时?可以是Number类本身,或者Number的子类,除此之外其他类型都不可以。
注意:?表示可以接收Number及其子类,但是子类之间不能互相转换,所以上限通配符仍然不能调用对象的setter方法设置一个具体的属性值。
extends可以用在泛型类的定义上:
此时T可以指代任意Number类及其子类的类型。
4.3、下限通配符
<? super 类> 此时?表示可以指代任意类型,但是该类型必须是后面类的父类。
例如:
此时表示?必须是String及其父类,所有此时?只能指代String或Object。
注意:下限通配符可以调用对象的setter方法设置一个具体的属性值,无论?是什么类型,规定好的下限类型一定可以通过向上转型变为父类。
4.4、类型擦除
类型擦除:所有泛型类型参数,若没有设置泛型上限,则编译之后统一擦除为Object类型,若设置了泛型上限,则编译之后统一擦除为相应的泛型上限。