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

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

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

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

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

 

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

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

 

 

你可能感兴趣的:(java)