史上最全java泛型总结

java泛型的作用

1、减少代码编写时类型的强转

2、将类型强转代码运行期的报错提前到代码编译期

3、代码更健壮,复用性更强

java泛型的类型

  • 泛型接口

  • 泛型类

  •  泛型方法

java泛型的原理?什么是泛型擦除机制?

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

Java编译器具体是如何擦除泛型的

1、检查泛型类型,获取目标类型

2、擦除类型变量,并替换为限定类型

        如果泛型类型的类型变量没有限定(<T>),则用Object作为原始类型

        如果有限定(<T extends XClass>),则用 XClass 作为原始类型

        如果有多个限定(<T extends XClass1 & XClass2>),则使用第一个边界XClass1作为原始类

3、在必要时插入类型转换以保持类型安全

4、生成桥方法以在扩展时保持多态性

泛型类型变量不能使用基本数据类型

比如没有ArrayList<int>,只有ArrayList<Integer>,当类型擦除后,ArrayList的原始类中的类型变量(T)替换成Object,但Object类型不能存放 int 值

不能使用instanceof运算符

因为擦除后,ArrayList<String> 只剩下原始类型,泛型信息String不存在了,所以没法使用 instanceof 

泛型在静态方法和静态类中的问题

因为泛型类中的泛型参数的实例化是在定义泛型类型对象(比如ArrayList<Integer>)的时候指定的,而静态成员是不需要使用对象来调用的,所有对象都没创建,如何确定这个泛型参数是什么

class Banana<T> {
    public static T val1; //直接在编辑阶段就报错
    public T val2;
}

泛型类型中的方法冲突

因为擦除后两个equals方法变成一样的了

没法创建泛型实例

因为类型不确定

没有泛型数组 

因为数组是协变,擦除后就没法满足数组协变的原则

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

super码王

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

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

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

打赏作者

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

抵扣说明:

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

余额充值