首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++和Java中的“泛型”类型有什么不同?

C++和Java中的“泛型”类型有什么不同?
EN

Stack Overflow用户
提问于 2008-08-30 21:14:28
回答 12查看 104.6K关注 0票数 165

Java有泛型,而C++为template提供了一个非常强大的编程模型。那么,C++和Java泛型有什么不同呢?

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2008-08-30 21:34:06

它们之间有很大的不同。在C++中,您不必为泛型类型指定类或接口。这就是为什么您可以创建真正的泛型函数和类,但需要注意的是需要更宽松的类型。

代码语言:javascript
复制
template <typename T> T sum(T a, T b) { return a + b; }

上面的方法添加了两个相同类型的对象,并且可以用于任何具有"+“运算符的类型T。

在Java中,如果要对传递的对象调用方法,则必须指定一个类型,如下所示:

代码语言:javascript
复制
<T extends Something> T sum(T a, T b) { return a.add ( b ); }

在C++中,泛型函数/类只能在头文件中定义,因为编译器会为不同的类型生成不同的函数(用来调用)。因此编译速度较慢。在Java中,编译没有很大的损失,但Java使用了一种称为“擦除”的技术,即在运行时擦除泛型类型,因此在运行时Java实际上是在调用...

代码语言:javascript
复制
Something sum(Something a, Something b) { return a.add ( b ); }

所以Java中的泛型编程并不是很有用,它只是一些语法糖,用来帮助新的foreach构造。

编辑:上面关于有用性的意见是由一个更年轻的自己写的。当然,Java的泛型有助于类型安全。

票数 160
EN

Stack Overflow用户

发布于 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扩展而来的,所以,预泛型,你可以像这样写代码:

代码语言:javascript
复制
public class PhoneNumbers {
    private Map phoneNumbers = new HashMap();
    
    public String getPhoneNumber(String name) {
      return (String) phoneNumbers.get(name);
    }
}

因为所有的Java集合类型都使用Object作为它们的基类型,所以您可以在其中放入任何内容。Java 5推出并添加了泛型,因此您可以执行以下操作:

代码语言:javascript
复制
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#不使用类型擦除,这会导致各种不同(例如,您可以使用原始类型,而IEnumerableIEnumerable<T>彼此没有关系)。

使用用Java 5+编译器编译的泛型的类可以在JDK1.4上使用(假设它不使用任何其他需要Java 5+的特性或类)。

这就是为什么Java泛型被称为syntactic sugar

但是这个关于如何做泛型的决定有着深远的影响,以至于(极好的) Java Generics FAQ如雨后春笋般涌现出来,以回答人们对Java泛型的许多问题。

C++模板有许多Java没有的特性:

  • 使用原始类型参数。

例如:

template类矩阵{ int Ti;... }

Java不允许在泛型中使用基本类型参数。

  • 使用default type arguments,这是我在java语言中遗漏的一个特性,但它有向后兼容的原因;

  • Java允许参数绑定。

例如:

公共类ObservableList { ... }

需要强调的是,具有不同参数的模板调用实际上是不同的类型。它们甚至不共享静态成员。在Java中,情况并非如此。

除了与泛型的区别之外,为了完整起见,这里有一个basic comparison of C++ and Java (和another one)。

我也可以推荐Thinking in Java。作为一名C++程序员,很多像对象这样的概念已经是第二天性了,但是有一些细微的区别,所以即使您浏览了一些部分,也值得有一个介绍性的文本。

在学习Java时,您将学到很多库(包括标准库--JDK中的库--和非标准库,其中包括Spring等常用的库)。Java语法比C++语法更冗长,并且没有很多C++特性(例如,操作符重载、多重继承、析构函数机制等),但这也不是严格意义上的C++子集。

票数 132
EN

Stack Overflow用户

发布于 2008-08-30 21:30:14

C++有模板。Java有泛型,看起来有点像C++模板,但它们非常不同。

顾名思义,模板的工作方式是为编译器提供一个(等待...)模板,它可以通过填充模板参数来生成类型安全代码。

据我所知,泛型的工作方式与之相反:编译器使用类型参数来验证使用它们的代码是否是类型安全的,但生成的代码根本没有类型。

可以将C++模板看作是一个非常好的宏系统,将Java看作是自动生成类型转换的工具。

票数 94
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档