C ++模板的Java等价物是什么?
我知道有一个名为Template的界面。这有关系吗?
答案 0 :(得分:49)
一个巨大的区别是在C ++中这是合法的:
<typename T> T sum(T a, T b) { return a + b; }
Java中没有等效的构造。你能说的最好的是
<T extends Something> T Sum(T a, T b) { return a.add(b); }
其中Something
有一个名为add
的方法。
在C ++中,会发生的事情是编译器为代码中使用的模板的所有实例创建模板的编译版本。因此,如果我们有
int intResult = sum(5, 4);
double doubleResult = sum(5.0, 4.0);
然后C ++编译器将为sum
编译int
版本,为sum
编译double
版本。
在Java中,有erasure的概念。会发生什么是编译器删除对泛型类型参数的所有引用。编译器只创建一个编译版本的代码,无论它与不同类型参数一起使用多少次。
其他差异
答案 1 :(得分:5)
Java中没有真正的模板。 C ++模板是用于生成类的编译时实体。在运行时,没有它们的痕迹。
在Java中,参数化类型是称为泛型的机制的一部分。它具有类似的用途,但在操作方式和含义方面存在显着差异。它在运行时有一些表示,有特定的规则等。
首先阅读Java tutorial,然后阅读Bloch的Effective Java,了解有关警告的详细说明,如果您想成为“超级用户”。
答案 2 :(得分:2)
Java中没有模板。唯一可与模板相媲美的是Java Generics。
http://java.sun.com/developer/technicalArticles/J2SE/generics/
答案 3 :(得分:1)
你真的不需要Java中的模板。当您需要完全不同的类型作为您不知道的参数时,模板主要是有用的。在Java中,所有对象都是虚拟的,并且从一个根对象继承,并且原始类型的定义更加清晰,并且转换的工作方式更加灵敏,所以实际上没有任何意义。
使用C ++样式模板可以获得更好的性能,但由于它们生成更多代码的方式和快速的CPU速度每年越来越超过数据访问速度这种情况越来越少,尤其是当涉及到对象而不是原语。
答案 4 :(得分:0)
Java具有与模板类似但不完全相同的泛型。我不知道模板界面是什么,但它与C ++模板无关。
答案 5 :(得分:0)
java中没有构建模板机制。相反,他们有仿制药。此外,ides有一些称为代码模板的东西,例如eclipse。