c# Java 中的泛型与 C++ 模板的比较

GJ(Generic Java)是对 Java 语言的一种扩展,是一种带有参数化类型的 Java 语言。

Generic Java 程序的语法在表面上与 C++ 中的模板非常类似,但是二者之间有着本质的区别。

首先,Java 语言中的泛型不能接受基本类型作为类型参数――它只能接受引用类型。这意味着可以定义 List<Integer>,但是不可以定义 List<int>。

其次,在 C++ 模板中,编译器使用提供的类型参数来扩充模板,因此,为 List<A> 生成的 C++ 代码不同于为 List<B> 生成的代码,List<A> 和 List<B> 实际上是两个不同的类。而 Java 中的泛型则以不同的方式实现,编译器仅仅对这些类型参数进行擦除和替换。类型 ArrayList<Integer> 和 ArrayList<String> 的对象共享相同的类,并且只存在一个 ArrayList 类。

 

C++ 模板与 C# 泛型存在着显著的差别。C# 泛型被编译成中间语言 IL,这使得在运行时会智能地为每个值类型创建相应的专用类型,而为引用类型只会创建一次专用类型;C++ 模板实际上是代码扩展宏,它为提供给模板的每个类型参数生成一个专用类型。因此,当 C++ 编译器遇到模板(例如整数 Stack)时,它会将模板代码扩展为 Stack 类并将整数作为该类本身的类型包含在其中。无论类型参数是值类型还是引用类型,如果不专门设计链接器来降低代码膨胀速度,C++ 编译器每次都会创建一个专用类,从而导致比使用 C# 泛型更显著的代码膨胀速度。

而且,C++ 模板不能定义约束。C++ 模板只能通过使用一个成员(可能属于也可能不属于类型参数),隐式定义约束。如果最终传递给泛型类的类型参数中存在该成员,程序将正常运行。否则,程序将失败,并可能返回隐藏的错误信息。由于 C# 泛型可以声明约束,并且具有严格的类型,因此不存在这些潜在的错误。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值