java泛型的原理?什么是泛型擦擦机制?
Java的泛型是JDK5新引入的特性,为了向下兼容,虚拟机其实不支持泛型,所以java实现的是一种伪泛型机制。也就是说java在编译期擦除了所有的泛型信息,这样java就不需要产生新的类型到字节码,所有的泛型类型最终都是一种原始类型,在java运行时根本就不存在泛型信息。
java编译器具体时如何擦除泛型的
-
检查泛型类型,获取目标类型
-
擦除类型变量,并替换为限定类型。
如果泛型类型的类型变量没有限定(),则用object作为原始类型
如果有限定(T extends XClass),则用XClass作为原始类型
如果有多个限定(T extends XClass1&XClass2),则使用第一个边界XClass1作为原始类
-
在必要时插入类型转换以保持类型安全
-
生成桥方法以在扩展时保持多态性
泛型中的约束和局限性
-
不能用基本类型实例化参数
-
运行时类型查询只适用于原始类型
-
泛型类的静态上下文中类型变量失效
-
不能创建参数化类型的数组
-
不能实例化类型变量
-
不能捕获泛型类的实例