泛型本质上是提供类型的"类型参数",它们也被称为参数化类型(parameterized type)或参量多态(parametric polymorphism)。其实泛型思想并不是 Java 最先引入的,C++ 中的模板就是一个运用泛型的例子。
GJ (Generic Java)是对 Java 语言的一种扩展,是一种带有参数化类型的 Java 语言。用 GJ 编写的程序看起来和普通的 Java 程序基本相同,只不过多了一些参数化的类型同时少了一些类型转换。实际上,这些 GJ 程序也是首先被转化成一般的不带泛型的 Java 程序后再进行处理的,编译器自动完成了从 Generic Java 到普通 Java 的翻译。
GJ 程序的语法在表面上与 C++ 中的模板非常类似,但是二者之间有着本质的区别。
首先,Java 语言中的泛型不能接受基本类型作为类型参数――它只能接受引用类型。这意味着可以定义 List<Integer>,但是不可以定义 List<int>。
其 次,在 C++ 模板中,编译器使用提供的类型参数来扩充模板,因此,为 List<A> 生成的 C++ 代码不同于为 List<B> 生成的代码,List<A> 和 List<B> 实际上是两个不同的类。而 Java 中的泛型则以不同的方式实现,编译器仅仅对这些类型参数进行擦除和替换。类型 ArrayList<Integer> 和 ArrayList<String> 的对象共享相同的类,并且只存在一个 ArrayList 类。
分享到:
相关推荐
例如,Java的泛型实现了类型擦除,这意味着编译后的字节码中不会保留类型参数信息,而C++模板会在编译时为每种不同的类型生成不同的实例。 ### 2. 定义简单的泛型 #### 创建泛型类 泛型类是一种带有类型参数的类,...
8. **与C++模板的区别**:虽然Java泛型和C++模板在概念上相似,但两者在实现和使用上有显著差异。模板是在编译时进行实例化的,而Java泛型则在编译后进行类型擦除。此外,Java泛型不支持模板的模板,即不能在泛型中...
通过这次实验,学生不仅可以学习到泛型的基本概念,还能深入理解C++ STL和Java泛型在实际编程中的应用。泛型使我们能够编写更通用的代码,减少冗余,提高代码复用性,同时保证类型安全。对于大型项目而言,这能显著...
3. **模板与泛型**:C++的模板提供了静态多态,而Java通过泛型实现了类似功能。转换器需要将模板转换为Java的泛型,但要注意Java泛型的边界和限制。 4. **异常处理**:C++的异常处理与Java的有所不同。转换器需要将...
#### 模板与宏的比较 尽管宏在某种程度上也能实现类型参数化,但它并不是理想的解决方案。宏的主要问题是它们不在C++的语法层面上工作,而是由预处理器处理。这意味着宏不会受到C++编译器的类型检查保护,容易导致...
C++模板可以在类和函数级别使用,甚至可以有模板模板。例如,一个简单的泛型栈可以这样实现: ```cpp template class Stack { private: std::vector<T> elements; public: void push(const T& value); T pop();...
Java 泛型是 Java SE 1.5 的新特性,它们在语法和应用环境上与 C++ 中的模板相似,但是本质上它们之间有着区别,这种区别就在于 Java 泛型的类型擦除。 Java 泛型的类型擦除是 Java 语言中的一种机制,它使得泛型...
阻塞队列是一种在多线程编程中广泛使用的并发数据结构,它在计算机科学和编程领域,特别是Java和C++等面向对象语言中扮演着重要角色。标题中的“支持多线程和泛型的阻塞队列”意味着我们讨论的是一个能够同时处理多...
C++的模板允许泛型编程,可以在编译时生成针对不同类型的代码,而Java的泛型是在运行时检查类型安全性的。 在异常处理方面,C++使用try-catch-finally结构,而Java也有类似的try-catch-finally语句块,但Java还引入...
### C++与Java的综述与比较 #### 引言 C++与Java都是面向对象的编程语言,Java从某种程度上来说是基于C++发展起来的,因此它们之间存在着诸多相似性和差异性。本文旨在对这两种语言进行一个全面的综述,并通过对比...
3. C++支持模板,允许泛型编程,而Java的泛型是类型擦除的,不提供编译时的多态性。 4. C++的异常处理使用try-catch-finally,Java同样如此,但在Java中,异常是强制性的,必须显式处理。 在从C++转向Java或反之的...
类型擦除也是Java泛型与C++模板机制的一个主要区别。 使用泛型可以提高代码的安全性和可读性,因为它允许编译器在编译时期进行类型检查,从而避免在运行时发生类型错误。例如,在集合框架中使用泛型可以防止错误...
无论您是否熟悉其他编程语言中的类似结构,如C++的模板,都将通过本文获得对Java泛型深入的理解。 #### 二、泛型的基本概念 **1. 泛型的目的** 泛型的主要目的是为了提高代码的复用性和安全性。在Java中,泛型...
通过对比Java泛型和C++模板(Templates),我们可以看到两者在设计上有相似之处,但也有本质的区别。Java的泛型提供了比C++模板更严格的类型检查,但以类型擦除作为实现的代价。这意味着Java泛型在类型安全的同时...
在Java中,泛型类型不像C++中的模板那样具有协变性。例如,`List<Integer>`不能自动转换为`List<Number>`,即使`Integer`是`Number`的一个子类。这是因为如果允许这种转换,将破坏类型安全。考虑以下代码: ```java...
第13章介绍了泛型编程和模板的概念,这是C++和Java编程中的重要概念,能够提高代码的复用性和灵活性。 第14章讲解了面向对象程序的建模图示,这些图示是理解程序结构和行为的关键工具。 第15章讲述了扩展类的概念...