什么是Java等价的C++模板?

gir*_*iri 22 c++ java generics templates

什么是Java等价的C++模板?

我知道有一个名为Template的界面.这有关系吗?

jas*_*son 50

Java中不存在C++中的模板.最好的近似是泛型.

一个巨大的区别是在C++中这是合法的:

<typename T> T sum(T a, T b) { return a + b; } 
Run Code Online (Sandbox Code Playgroud)

Java中没有等效的构造.你能说的最好的是

<T extends Something> T Sum(T a, T b) { return a.add(b); }
Run Code Online (Sandbox Code Playgroud)

哪里Something有一个叫做的方法add.

在C++中,发生的是编译器为代码中使用的模板的所有实例创建模板的编译版本.因此,如果我们有

int intResult = sum(5, 4);
double doubleResult = sum(5.0, 4.0);
Run Code Online (Sandbox Code Playgroud)

然后C++编译器将编译sumfor int的版本和sumfor 的版本double.

在Java中,存在擦除的概念.会发生什么是编译器删除对泛型类型参数的所有引用.编译器只创建一个编译版本的代码,无论它与不同类型参数一起使用多少次.

其他差异

  • @gnud:没错,但是有一个微妙的区别.在C++中,我上面写的模板是合法的,没有限制`T`; 只有当你尝试使用没有定义`+`的类型时才会出现故障.在Java中,没有等价物.因此,在C++中,您可以对任何具有"+"的内容说"定义`sum`".在Java中你不能这样说; 你只能指定`T`扩展`Something`有一个`add`方法.因此,如果你有一个'U`不扩展`Something`但它有一个`add`方法,你不能在'U`的实例上使用上面定义的`sum`. (5认同)
  • C++确实允许类型参数的绑定,但是以一种非常迂回的方式.基本上,如果模板扩展由于某些原因而失败,则会从候选扩展列表中删除它.这在C++社区中称为SFINAE(替换失败不是错误).您可以使用它来对类进行编译时内省,并以某种方式扩展某些事物而将其他事物扩展. (2认同)

Uri*_*Uri 5

Java中没有真正的模板.C++模板是用于生成类的编译时实体.在运行时,没有它们的痕迹.

在Java中,参数化类型是称为泛型的机制的一部分.它具有类似的用途,但在操作方式和含义方面存在显着差异.它在运行时有一些表示,有特定的规则等.

首先阅读Java教程,然后阅读Bloch的Effective Java,了解如果您想成为"超级用户"的详细说明.