java 泛型

70 阅读1分钟

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

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

java编译器具体时如何擦除泛型的

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

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

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

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

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

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

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

泛型中的约束和局限性

  1. 不能用基本类型实例化参数

  2. 运行时类型查询只适用于原始类型

  3. 泛型类的静态上下文中类型变量失效

  4. 不能创建参数化类型的数组

  5. 不能实例化类型变量

  6. 不能捕获泛型类的实例