Java泛型这个特性是从JDK 1.5才开始加入的,因此为了兼容之前的版本,Java泛型的实现采取了“伪泛型”的策略,即Java在语法上支持泛型,但是在编译阶段会进行所谓的“类型擦除”(Type Erasure),将所有的泛型表示(尖括号中的内容)都替换为具体的类型(其对应的原生态类型),就像完全没有泛型一样。
原始类型 就是擦除去了泛型信息,最后在字节码中的类型变量的真正类型。
什么是泛型,有什么作用?
泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。
与非泛型代码相比,使用泛型有三大优点:
更健壮(在编译时进行更强的类型检查)、
更简洁(消除强转,编译后自动会增加强转)、
更通用(代码可适用于多种类型)* 适用于多种数据类型执行相同的代码(代码复用)
什么是类型擦除机制?
Java编译器中
先检查代码中泛型的类型(类型检查就是编译时完成的),
然后在进行类型擦除,
再进行编译。
类型擦除的具体步骤?
Java编译器是通过先检查代码中泛型的类型,然后在进行类型擦除,再进行编译。
如何证明类型的擦除呢?
如何理解泛型的编译期检查?
如何理解基本类型不能作为泛型类型?
如何理解泛型类型不能实例化?
泛型数组:能不能采用具体的泛型类型进行初始化?
泛型数组:如何正确的初始化泛型数组实例?
如何理解泛型类中的静态方法和静态变量?