Java有泛型,而C++为template提供了一个非常强大的编程模型。那么,C++和Java泛型有什么不同呢?
发布于 2008-08-30 21:34:06
它们之间有很大的不同。在C++中,您不必为泛型类型指定类或接口。这就是为什么您可以创建真正的泛型函数和类,但需要注意的是需要更宽松的类型。
template <typename T> T sum(T a, T b) { return a + b; }上面的方法添加了两个相同类型的对象,并且可以用于任何具有"+“运算符的类型T。
在Java中,如果要对传递的对象调用方法,则必须指定一个类型,如下所示:
<T extends Something> T sum(T a, T b) { return a.add ( b ); }在C++中,泛型函数/类只能在头文件中定义,因为编译器会为不同的类型生成不同的函数(用来调用)。因此编译速度较慢。在Java中,编译没有很大的损失,但Java使用了一种称为“擦除”的技术,即在运行时擦除泛型类型,因此在运行时Java实际上是在调用...
Something sum(Something a, Something b) { return a.add ( b ); }所以Java中的泛型编程并不是很有用,它只是一些语法糖,用来帮助新的foreach构造。
编辑:上面关于有用性的意见是由一个更年轻的自己写的。当然,Java的泛型有助于类型安全。
发布于 2009-01-31 05:22:50
Java泛型是与C++模板不同的大规模。
基本上,在C++中,模板基本上是一个美化的预处理器/宏集(注:,因为有些人似乎无法理解一个类比,所以我不是说模板处理是一个宏)。在Java中,它们基本上是语法糖,可以最大限度地减少对象的样板转换。这是一个相当不错的introduction to C++ templates vs Java generics。
详细说明这一点:当您使用C++模板时,您基本上是在创建代码的另一个副本,就像您使用#define宏一样。这允许您在模板定义中使用int参数来确定数组的大小等。
Java不是那样工作的。在Java中,所有对象都是从java.lang.Object扩展而来的,所以,预泛型,你可以像这样写代码:
public class PhoneNumbers {
private Map phoneNumbers = new HashMap();
public String getPhoneNumber(String name) {
return (String) phoneNumbers.get(name);
}
}因为所有的Java集合类型都使用Object作为它们的基类型,所以您可以在其中放入任何内容。Java 5推出并添加了泛型,因此您可以执行以下操作:
public class PhoneNumbers {
private Map<String, String> phoneNumbers = new HashMap<String, String>();
public String getPhoneNumber(String name) {
return phoneNumbers.get(name);
}
}这就是所有的Java泛型:用于转换对象的包装器。这是因为Java泛型没有经过精炼。他们使用类型擦除。之所以做出这个决定,是因为Java Generics在这篇文章中出现得太晚,以至于他们不想破坏向后兼容性(只要调用Map<String, String>,就可以使用Map )。与.Net/C#相比,.Net/C#不使用类型擦除,这会导致各种不同(例如,您可以使用原始类型,而IEnumerable和IEnumerable<T>彼此没有关系)。
使用用Java 5+编译器编译的泛型的类可以在JDK1.4上使用(假设它不使用任何其他需要Java 5+的特性或类)。
这就是为什么Java泛型被称为syntactic sugar。
但是这个关于如何做泛型的决定有着深远的影响,以至于(极好的) Java Generics FAQ如雨后春笋般涌现出来,以回答人们对Java泛型的许多问题。
C++模板有许多Java没有的特性:
例如:
template类矩阵{ int Ti;... }
Java不允许在泛型中使用基本类型参数。
例如:
公共类ObservableList { ... }
需要强调的是,具有不同参数的模板调用实际上是不同的类型。它们甚至不共享静态成员。在Java中,情况并非如此。
除了与泛型的区别之外,为了完整起见,这里有一个basic comparison of C++ and Java (和another one)。
我也可以推荐Thinking in Java。作为一名C++程序员,很多像对象这样的概念已经是第二天性了,但是有一些细微的区别,所以即使您浏览了一些部分,也值得有一个介绍性的文本。
在学习Java时,您将学到很多库(包括标准库--JDK中的库--和非标准库,其中包括Spring等常用的库)。Java语法比C++语法更冗长,并且没有很多C++特性(例如,操作符重载、多重继承、析构函数机制等),但这也不是严格意义上的C++子集。
发布于 2008-08-30 21:30:14
C++有模板。Java有泛型,看起来有点像C++模板,但它们非常不同。
顾名思义,模板的工作方式是为编译器提供一个(等待...)模板,它可以通过填充模板参数来生成类型安全代码。
据我所知,泛型的工作方式与之相反:编译器使用类型参数来验证使用它们的代码是否是类型安全的,但生成的代码根本没有类型。
可以将C++模板看作是一个非常好的宏系统,将Java看作是自动生成类型转换的工具。
https://stackoverflow.com/questions/36347
复制相似问题