C++ 模板 vs. Java泛型
在开发大型项目时,我们需要使代码与提供的任何类型的数据兼容。这就是您的编写代码与其他代码区别的地方。我们的意思是,您编写的代码应该对提供给程序的任何类型的数据都是通用的,无论其数据类型如何。这就是Java中的泛型和C++中的模板的用处。虽然它们都能执行类似的功能,但在某些方面它们有所不同。
C++中的模板
模板用于在C++中创建通用程序。
- C++中的模板使用元编程是一个重要特性。它允许提供的代码的模板签名不同,C++提供了实现它们的能力。
- 类和函数都可以用作模板参数。
- 模板源码必须包含在C++头文件中。
- 模板特化是可能的,这意味着可以实现特定类型和方法的模板。
C++程序示例
// CPP program to illustrate Templates
#include <iostream>
#include <string.h>
using namespace std;
template <class T>
class TempClass {
T value;
public:
TempClass(T item)
{
value = item;
}
T getValue()
{
return value;
}
};
int main()
{
class TempClass<string>* String =
new TempClass<string>("Generics vs Templates");
cout << "Output Values: " << String->getValue()
<< "\n";
class TempClass<int>* integer = new TempClass<int>(9);
cout << "Output Values: " << integer->getValue();
}
输出:
Output Values: Generics vs Templates
Output Values: 9
Java泛型
- Java泛型最重要的特性之一是,它在实例化时处理类型检查,并生成与非泛型代码等效的字节码。
- 由于Java编译器在实例化之前检查类型,泛型的实现是类型安全的。与此同时,在C++中,模板没有类型的概念。
- 当在类中使用泛型时,它会应用于该类中的所有类和方法。
- 在Java中使用泛型的另一个重要原因是它允许你消除向下转型。
- 与使用特定对象而不是泛型类型T的等效类相比,使用泛型类实例化没有运行时开销。
// Java program to illustrate
// Generics
public class GenericClass<T> {
private T value;
public GenericClass(T value)
{
this.value = value;
}
public void showType()
{
System.out.println("Type:" +
value.getClass().getSimpleName());
System.out.println("Value: " + value);
}
public static void main(String[] args)
{
GenericClass<String> Str =
new GenericClass<String>("Generics vs Templates");
GenericClass<Integer> integer =
new GenericClass<Integer>(9);
Str.showType();
integer.showType();
}
}
输出:
Type: String
Value: Generics vs Templates
Type: Integer
Value: 9
Java中的泛型与C++模板
虽然创建泛型类型的方法在某些地方不同,但它们在实现属性上是相同的。
- 类型擦除: 类型擦除确保在编译期间进行更严格的类型检查。Java泛型仅提供编译时安全性,同时消除了需要进行类型转换的需求。这是直接在Java编译器前端完成的,确保了类型擦除。
- 当你在C++中使用模板时,编译器会在将泛型参数替换为您使用的类型后重新发出模板代码。这在很多方面更强大,但可能导致执行文件膨胀。
- 包装类: 在Java中,即使我们需要在任何对象使用的函数调用中明确指定数据类型,我们也不需要像在C++中使用实际数据类型那样进行类型转换;相反,我们使用包装类来完成这个任务。
- 类型检查: 在实例化期间,Java泛型处理类型检查并生成与非泛型代码等效的字节码。C++具有”潜在类型”和模板元编程,每个实例化都会生成一个新类。