什么是泛型?

目录

一、什么是泛型

二、泛型方法

三、泛型接口

四、通配符

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类型,若设置了泛型上限,则编译之后统一擦除为相应的泛型上限。

版权声明:程序员胖胖胖虎阿 发表于 2022年10月19日 下午7:24。
转载请注明:什么是泛型? | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...