一、C++ 模板
编译时,模板机制,产生相对应的实际类型或者函数,运行时看不到泛型。
缺点:会导致代码膨胀。
优点:C++模板基于签名的隐式约束,灵活性高
二、JAVA
编译时,搽试法,没有在虚拟机层改动,java编译器支持泛型类型检查,java编译器只是做了类型安全的控制,泛型的占位符号还是object,对泛型的支持非常弱。其实就是参数类型为Object,和C++的模板机制相对,只有一个类型,所有泛型均共享一个模板(参数都为Object)。
优点:不会导致代码膨胀
缺点:只能使用参数Object的接口,对泛型支持比较弱
三、DotNet
运行时泛型,CLR在运行时支持泛型,在各个支持CLR的语言进行无缝操作。C#泛型在编译为IL和元数据时,使用特殊占位符来表示泛型类型,T只作为占位符,并用专用的IL指令支持泛型操作。而真正的泛型实例化以“on-demand”的方式,发生在JIT编译时。一般而言,所有的引用类型的泛型实例共享一个模板,而为一个不同的值类型,产生独立的代码。对于引用类型,本质上都是指针,处理就相当于java的茶室法。
优点:1不会导致C++中代码膨胀的问题;
2因为是JIT编译时实例化,可以应用于反射;
3可以使用泛型参数约束来实现对类型参数的显式约束;
4类型安全,不用向下转换,尤其是装箱拆箱操作。
C#泛型小结:
泛型类型支持:类,接口,委托,结构以及方法成员;
泛型约束包括:基类,接口,构造器,值类型/引用类型;