泛型与类型擦除

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

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

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


泛型擦除之前的代码

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


©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容