一尘不染

C++ 和 Java 中的“通用”类型有什么区别?

java

Java 有泛型,C 提供了一个非常强大的编程模型template。那么,C 和 Java 泛型有什么区别呢?


阅读 923

收藏
2020-01-07

共1个答案

一尘不染

他们之间有很大的不同。在 C++ 中,您不必为泛型类型指定类或接口。这就是为什么您可以创建真正通用的函数和类,但需要注意的是更宽松的类型。

template <typename T> T sum(T a, T b) { return a + b; }

上面的方法添加了两个相同类型的对象,并且可以用于任何具有“+”运算符的类型 T。

在 Java 中,如果要对传递的对象调用方法,则必须指定类型,例如:

<T extends Something> T sum(T a, T b) { return a.add ( b ); }

在 C++ 中,泛型函数/类只能在标头中定义,因为编译器会为不同的类型(调用它的)生成不同的函数。所以编译比较慢。在 Java 中,编译没有重大损失,但 Java 使用一种称为“擦除”的技术,其中泛型类型在运行时被擦除,因此在运行时 Java 实际上是调用…

Something sum(Something a, Something b) { return a.add ( b ); }

因此,Java 中的泛型编程并不是真正有用,它只是帮助新的 foreach 构造的一点语法糖。

编辑:上面关于有用性的意见是由一个年轻的自己写的。Java 的泛型当然有助于类型安全。

2022-03-22