什么是泛型?

目录

一、什么是泛型

二、泛型方法

三、泛型接口

四、通配符

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

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怎样让大排不硬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值