C++ 模板 vs. Java泛型

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++具有”潜在类型”和模板元编程,每个实例化都会生成一个新类。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程