java 语言中泛型主要是为了解决什么问题_深入理解Java泛型机制——详解泛型的日常应用有哪些?...

泛型的日常应用有:泛型类、泛型普通方法、泛型静态方法、泛型接口、泛型擦除模式、泛型通配符、泛型上下边界。

1. 泛型类

泛型类型用于类的定义中,被称为泛型类。最典型应用的就是各种容器类,如:List、Set、Map等。

泛型类的基本写法:

045b9fceba3f34dcff3b009000221974.png

一个普通的泛型类(案例中泛型属性可以正常生成get set方法):

f658715d3c222ef8ea07595ba252b713.png

(main方法测试前,请先生成属性对应的get set方法)

52a5609101c1dc4b0e9b76d79d9c31f5.png

演示效果(部分展示)

0000136d0e67d89833434f110e2b4f51.png

2. 泛型普通方法

泛型在定义普通泛型方法的时候,可以使用泛型类定义的泛型类型(本案例),也可以在普通方法中定义这个方法自己需要的特定泛型类型(参照下面的泛型静态方法定义自定义泛型方法中使用到的泛型类型)

2973f8decff5bea5b7cb677af9247dfd.png

main方法测试代码:

c1f5f30d82cea26f6dff42117a37176c.png

控制台效果:

6a2fd8d0fdc57f3b2e8ae9f65ca14378.png

3. 泛型静态方法

泛型静态方法中必须要声明本个方法中使用的泛型类型(),泛型类和泛型静态方法没有任何关系,泛型类是针对对象的,泛型静态方法针对于是整个类,所以为了避免混淆,建议泛型类声明的泛型类型(T)和泛型静态方法中声明的泛型类型(W)使用不同的字符来表示。

以下是无返回值的泛型静态方法:

bc23cb95e04b42b18c5fdcd106a786b1.png

main方法测试:

d2019f3712a97e5fe8543caa48283e7f.png

有返回值泛型静态方法:

6eff80e9b2f3d98c0c9be3d9f9791abb.png

main方法测试:

60ab8353b25c2e1dc568584115dd2f05.png

控制台运行效果:

9b6e0e5ed1ec1812c014d3d66fb7e16e.png

4.泛型接口

泛型接口与泛型类的定义及使用基本相同。

泛型接口的实现类,可以指定具体的泛型接口的具体泛型的类型。

泛型接口

a123fa554a55ffb6e7a95a228426310c.png

泛型接口实现类(实现泛型接口中的泛型类型)

fdc73329d0cc3c4ebbf3d3ee368335e3.png

main方法测试:

c92a13c0e1487856fc026030f121aef2.png

控制台演示效果:

1db1f1ab8871d89e78488f2df62e20ec.png

泛型接口的实现,如果没有指定具体的泛型类型,必须要在这个实现类中声明一个泛型类型占位符给接口用。

泛型接口实现类(没有实现泛型接口中的泛型类型)

9a36df0eb74f5d99ddb9f7dc610884ab.png

main方法测试:

959c291b2e83d0e213c5c0cf20c9b34b.png

控制台效果:

104e37e276313a6c1277901e2c74ee7f.png

5.泛型的擦除模式

Java中的泛型实际是伪泛型,在代码编译期间有泛型做限制,但在代码运行期间,会将所有的泛型全部擦除掉。所以无论使用什么样不同类型的泛型,结果其class对象都是一致的

0edaaced7bd01baaf99530ba3639861b.png

使用不同类型的泛型,比较其class文件,发现是相等的,证明泛型在运行期间被擦除

b8004c167ec6741682b11717933b36f5.png

运行结果:

81f495a9b348eac994fb71c71c55b455.png

为什么要使用擦除模式?

为了兼容JDK老版本的编码。

6.泛型通配符

Java中的继承并不是泛型中的继承。也就是说Java中的父子关系,在泛型中并不是父子关系

4e17ab8ccd9566c979ee34b0a5a25707.png

针对于上面的show方法进行以下测试,分别定义两个不同类型泛型的类型,分别调用show方法,我们会发现p.show(p)正常执行,但是p.show(p1)无法执行,编译报错,由此证明Java中Number是Integer的父类,但是在泛型中,泛型并不知道Number是Integer的父类

570eaf08ac22cab8b60f05eab72d7d7f.png

通配符:由于java中的继承关系,在泛型中不做任何声明修饰的情况下,是不被认可的,所以要使用通配符进行处理。接下来会使用通配符在泛型中将java中的继承关系重新绑定。

通配符一般使用?来表示,可以理解为?在泛型中所有类的父类。

cb1c61f3a1c555abe83a47836cdfa828.png

使用通配符后代码正常编译执行:

42a6be1795d4f27c26e6f98589189895.png

演示效果:

e5986506f371ee0e45ba6a2b69753330.png

7. 泛型上下边界

上面在泛型中的继承问题,通过使用通配符就可以很好的解决掉,但是我们会发现如果只使用通配符这个泛型的绑定没有任何意义,因为使用通配符就意味着所有的类型都可以注入进来,所以为了解决这个问题,泛型引入了上边界和下边界。

Extends(上边界)和super(下边界)关键字

上边界使用:

在读取T这个类型数据的时候,但不写入数据的时候,使用上边界

f2ed7c12c5ff4115da31eebd18633424.png

测试代码:

6bccf1bfb97f1727d1683552d774aa5b.png

效果演示:

2ebdc903d35b6f9aabde3a7521aba717.png

下边界使用:

需要写入数据的时候,但不需要读取的时候

6705dd78870bc63e501ea83b407f96b6.png

测试代码:

fde57ab5cd61517abf80b086c62d638b.png

写了这么多,如果大家还有不明白的地方,可以关注我,私信我。

看完记得点赞收藏,感谢支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值