泛型与类型擦除

泛型是JDK1.5的一项新增特性,他的本质是参数化类型(Parametersized Type)的应用,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类,接口和方法的创建中,分别被称为泛型类、泛型接口和泛型方法。

泛型技术在c#和java中的使用方式看似相同,但实现上却有着根本性的分歧,C#里面泛型无论在程序源码中、编译后的IL中,或是运行期的CLR中,都是切实存在的,List与List就是两个不同的类型,他们在系统运行期生成,有自己的虚方法表和类型数据,这种实现称为类型膨胀,基于这种方法实现的泛型称为真实泛型。

java语言中的泛型则不一样,他只在程序源码中存在,在编译后的字节码文件中,就已经替换为原来的原生类型(Raw Type 也成为裸类型)了,并且在相应的地方插入了强制转换型代码,因此,对于运行期的java语言来说List与List就是同一个类,所以泛型技术实际上是java语言的一颗语法糖,java语言中的泛型实现方法称为类型擦除,基于这种方法实现的泛型称为伪泛型。


泛型擦除之前的代码

把这段java代码编译成class文件,然后再用字节码反编译工具进行反编译后,将会发现泛型都不见了,程序又变成了java泛型出现之前的写法,泛型类型都变回了原生类型:


你可能感兴趣的:(泛型与类型擦除)