📜  C++中的模板与Java的泛型

📅  最后修改于: 2021-05-30 10:50:42             🧑  作者: Mango

在构建大型项目时,我们需要代码与提供给它的任何类型的数据兼容。那是您的书面代码比其他代码更高的地方。在这里,我们的意思是使您编写的代码对于提供给程序的任何类型的数据都是通用的,而不管其数据类型如何。这是Java和C++中类似的名为Template的泛型派上用场的地方。尽管两者具有相似的功能,但是它们在某些地方有所不同。

C++中的模板

用C++编写通用程序称为模板。

  1. C++中模板的主要功能之一是元编程的使用。如果C++提供了实现它们的功能,则它使所提供代码的模板签名不同。
  2. 模板参数可以是类,也可以是函数。
  3. C++要求将模板源添加到其标题中。
  4. 可以实现模板的专业化,即可以实现模板的特定类型和方法。
// CPP program to illustrate Templates
#include 
#include 
  
using namespace std;
  
template 
class TempClass {
  
    T value;
  
public:
    TempClass(T item)
    {
        value = item;
    }
  
    T getValue()
    {
        return value;
    }
};
  
int main()
{
    class TempClass* String = 
      new TempClass("Generics vs Templates");
  
    cout << "Output Values: " << String->getValue() 
         << "\n";
  
    class TempClass* integer = new TempClass(9);
    cout << "Output Values: " << integer->getValue();
}
输出:
Output Values: Generics vs Templates
Output Values: 9

Java泛型

  1. Java泛型的主要功能之一是它在实例化期间处理类型检查,并生成与非泛型代码等效的字节码。
    Java的编译器在实例化之前检查类型,从而使Generic类型安全的实现成为可能。同时,在C++中,模板对类型一无所知。
  2. 如果将泛型应用于类中,则它将被应用于类和类中的方法。
  3. 导致在Java使用泛型的另一个主要因素是,因为它使您可以消除垂头丧气。
  4. 实例化泛型类比使用用作特定对象而不是泛型T的等效类具有运行时开销。
// Java program to illustrate
// Generics
public class GenericClass {
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 Str = 
           new GenericClass("Generics vs Templates");
  
        GenericClass integer = 
                         new GenericClass(9);
  
        Str.showType();
        integer.showType();
    }
}
输出:
Type:String
Value: Generics vs Templates
Type:Integer
Value: 9

C++模板与Java的泛型

尽管创建通用类型的两种方法都相似,但是它们在某些地方有所不同,而它们拥有的实现属性却是相同的。

  1. 类型擦除:类型擦除可确保在编译期间进行更严格的类型检查。 Java泛型仅提供编译时安全性,并且不需要强制转换。这是直接在Java编译器前端中实现的,并确保已完成类型擦除。
  2. 在C++中,当您使用模板时,编译器在将模板中的通用参数替换为您使用的类型后,将再次发出模板代码。它以多种方式更强大,但会导致可执行文件膨胀
  3. Wrapper类:在Java,即使我们必须特别指定在其中使用任何对象进行函数调用的数据类型,我们也不必像使用实际数据类型的C++那样强制转换它,而是可以使用包装器类来进行必需的。
  4. 类型检查: Java泛型在实例化期间处理类型检查,并生成与非泛型代码等效的字节码C++具有“潜在类型”和模板元编程,并为每个实例化生成一个新类

Java鼓励软件重用,并为通用编程添加了一些基本支持。对于Java,这是商业软件开发领域的重要一步。

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”