Java基础-我所理解的泛型

Java基础-我所理解的泛型


引用

【java】泛型中,? extends T 与 ? super T 的区别、看法_winrh的博客-CSDN博客_泛型 extends


前言

Java基础系列,我所整理的仅仅是自己平常没有用到的,或者是自己不太了解的内容。


Java的泛型其实仅仅是伪泛型,为什么这么说呢?其实Java的泛型其实仅仅是一种文字游戏,我所能思考到的唯一的好处就是他能够在编译阶段发现一些强转的问题,在后续的归纳中我会逐步给你进行归纳。

说真的,我还真的不知道Java的泛型还有这样的表示方法,看来Java比我想象中的要聪明一些,不过既然支持这样的操作,那么今后我能写的代码的复用性就能更高了,提前庆祝一下!
<T extends A & B & C & D>:只有A可能为类,因为Java只支持单继承模型。

List<? extends A>:List内存储的类型,你自己都不知道,你不可能往里面放任何类型的数据信息,甚至连A都不行,因为假如里面存储的类型为A的子类,那放A进去也会造成数据的丢失。但是从里面拿出来的东西,一定是A的子类,这点倒是没有问题。


疑问

Q::Java泛型的原理?什么是泛型擦除机制?
A:Java的泛型是JDK5新引入的特性,为了向下兼容,虚拟机其实是不支持泛型,所以Java实现的是一种伪泛型机制,也就是说Java在编译器擦出了所有的泛型信息,这样Java就不需要产生新的类型到字节码,所有的泛型类型最终都是一种原始类型,在Java运行时根本就不存在泛型信息。

Q:Java编译器具体是如何擦除泛型的?
A:
1. 检查类型变量,获取目标类型
2. 擦除类型变量,并替换为限定类型
如果泛型类型的类型变量没有限定(),则用Object作为原始类型
如果有限定,则用XClass 作为原始类型
如果有多个限定(T extends XClass1XClass1),则使用第一个边界XClass1作为原始类,因为单继承模型的原理,只有第一个才可能是类
3. 在必要时插入类型转化以保持类型安全
4. 生成桥方法以在扩展时保持多态性

Q:为什么没有泛型数组?
A:因为数组是协变,擦除后就没有办法满足数组协变的原则。同理,A extends B,Temp和Temp没有继承关系,也就是说两者之间是不可以进行强转的。
协变:一个类是另外一个类的子类,那么这个类的数组就是另外一个类的子类。

猜你喜欢

转载自blog.csdn.net/qq_31433709/article/details/107887709
今日推荐