一、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#泛型小结:

泛型类型支持:类,接口,委托,结构以及方法成员;

泛型约束包括:基类,接口,构造器,值类型/引用类型;

 

posted on 2008-07-11 20:55  magiclee  阅读(538)  评论(0编辑  收藏  举报