重读《深入理解Java虚拟机》六、Java泛型 VS C#泛型 (伪泛型 VS 真泛型)

一、泛型的本质

泛型是参数化类型的应用,操作的数据类型不限定于特定类型,可以根据实际需要设置不同的数据类型,以实现代码复用。

二、Java泛型

Java 泛型是Java1.5新增的特性,JVM并不支持。

实现原理:Java源代码里面类型提供实现泛型功能,而编译后Class文件类型就变成原生类型(即类型被擦除掉),而在引用处插入强制类型转换以实现JVM对泛型的支持。本质是Java泛型只是Java提供的一个语法糖,底层

的JVM并不提供支持,Java中的泛型属于伪泛型。

但是编译后的字节码通过反射后还是可以获取到泛型的真实类型信息,因为泛型擦除并没有把保存泛型元数据擦除掉。

三、C#泛型

C# 泛型是2.0C#和CLR中新增的特性,CLR支持。

实现原理:C#无论语言层面还是CLR都提供对泛型的支持,所以C#泛型编译后MSIL泛型都是切实存在的,类型不没有变成原生类型,而是通过类型膨胀实现,在运行期生成,自己的虚方法表和类型数据.C#泛型属于真泛型

四、小结

Java泛型只是语言层面上的一颗的语法糖以便于程序的开发,而C#泛型是在底层CLR就开始支持,通过类型膨胀实现。

原文地址:https://www.cnblogs.com/wshcn/p/7076547.html