C++ 模板与 Java泛型


模板是泛型编程的基础,泛型编程涉及以独立于任何特定类型的方式编写代码。

模板是创建泛型类或函数的蓝图或公式。库容器(如迭代器和算法)是泛型编程的示例,并且是使用模板概念开发的。

每个容器(例如 vector)只有一个定义,但我们可以定义许多不同类型的 vector,例如 vector <int> 或 vector <string>。

示例代码

#include <iostream>
#include <string>
using namespace std;
template <typename T>
inline T const& Max (T const& a, T const& b) {
   return a < b ? b:a;
}
int main () {
   int i = 39;
   int j = 20;
   cout << "Max(i, j): " << Max(i, j) << endl;
   double f1 = 13.5;
   double f2 = 20.7;
   cout << "Max(f1, f2): " << Max(f1, f2) << endl;
   string s1 = "Hello";
   string s2 = "World";
   cout << "Max(s1, s2): " << Max(s1, s2) << endl;
   return 0;
}

输出

Max(i, j): 39
Max(f1, f2): 20.7
Max(s1, s2): World

另一方面,Java 使用泛型。

Java 泛型方法和泛型类使程序员能够分别使用单个方法声明来指定一组相关方法,或使用单个类声明来指定一组相关类型。

泛型还提供编译时类型安全性,允许程序员在编译时捕获无效类型。

使用 Java 泛型概念,我们可以编写一个用于对对象数组进行排序的泛型方法,然后使用 Integer 数组、Double 数组、String 数组等调用该泛型方法来对数组元素进行排序。

泛型方法

您可以编写一个可以调用不同类型参数的单个泛型方法声明。根据传递给泛型方法的参数类型,编译器会适当地处理每个方法调用。以下是定义泛型方法的规则:

  • 所有泛型方法声明都有一个类型参数部分,该部分由尖括号(< 和 >)分隔,位于方法的返回类型之前(在下一个示例中为 < E >)。

  • 每个类型参数部分包含一个或多个用逗号分隔的类型参数。类型参数也称为类型变量,是指定泛型类型名称的标识符。

  • 类型参数可用于声明返回类型并充当传递给泛型方法的参数类型的占位符,这些参数称为实际类型参数。

  • 泛型方法的主体像任何其他方法一样声明。请注意,类型参数只能表示引用类型,不能表示原始类型(如 int、double 和 char)。

示例代码

public class GenericMethodTest {
   // generic method printArray
   public static < E > void printArray( E[] inputArray ) {
      // Display array elements
      for(E element : inputArray) {
         System.out.printf("%s ", element);
      }
      System.out.println();
   }
   public static void main(String args[]) {
      // Create arrays of Integer, Double and Character
      Integer[] intArray = { 1, 2, 3, 4, 5 };
      Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
      Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };
      System.out.println("Array integerArray contains:");
      printArray(intArray); // pass an Integer array
      System.out.println("\nArray doubleArray contains:");
      printArray(doubleArray); // pass a Double array
      System.out.println("\nArray characterArray contains:");
      printArray(charArray); // pass a Character array
   }
}

输出

Array integerArray contains:
1 2 3 4 5
Array doubleArray contains:
1.1 2.2 3.3 4.4
Array characterArray contains:
H E L L O

现在让我们看看模板和泛型之间的区别。区别如下:

  • 它使用类型擦除;这确保了编译时更严格的类型检查。Java 中的泛型提供编译时安全性并消除了类型转换的需要。这直接存在于 Java 编译器前端以确保执行此类型的擦除。

  • 在 C++ 中,如果使用模板,编译器会在用给定类型替换泛型参数后再次发出模板代码。

  • 在 Java 中,即使我们必须指定数据类型,在使用任何对象进行函数调用时,我们也不需要像 C++ 中那样使用实际数据类型将其类型转换为包装类。

  • Java 泛型在初始化时使用类型检查,并生成等效于非泛型代码的字节码 C++ 具有“后期绑定”和模板元编程,并为每个实例生成新的类。

更新于: 2019-07-30

2K+ 阅读量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.