`
chensl
  • 浏览: 57978 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

泛型代码与虚拟机

阅读更多

虚拟机没有泛型对象,所有对象都属于普通类,使用当前Sun的编译器来编译Java泛型代码,结果类将不能再5.0以前的虚拟机上运行。定义的泛型类型,都自动提供了一个相应的原始类型(raw type)原始类型的名字就是删去类型参数后的泛型名,擦出掉类型变量,并替换为限定类型(无限定的变量用Object)例如前文中提到的 Pair<T> 的raw type如下:

public class Pair
{  //因为T是一个无限定类型的变量,所以直接用Object替换,如果有限定的类型,就用第一个限定的类型变量来替换,否则用Object替换
    public Pair(Object first, Object second)     {
        this.first = first;
        this.second = second;
    }
    public Object getFirst() { return first; }
    public Object getSecond() { return second; }
    public void setFirst(Object newValue) { first = newValue; }
    public void setSecond(Object newValue) { second = newValue; }
    private Object first;
    private Object second;
}

 

以上结果类似一个普通类,就像泛型引入Java之前已经实现的那样。原始类型被替换后,编译器在必要时要插入强制类型转换,通过桥接法来合成保持多态。

 

调用遗留代码

 

Java SE5之前不支持泛型,不过可以通过将泛型类与遗留的API中原始的对应概念放在一起使用。可以通过添加注释(annotation)使警告消失,

@SuppressWarnings("unchecked")   //添加注释, 注释必须放在被警告的代码所在方法的前面
public void configureSlider() { . . . }

 

分享到:
评论

相关推荐

    Java泛型解析(03)虚拟机执行泛型代码.doc

    Java泛型解析(03)虚拟机执行泛型代码.doc

    JAVA基础好东西啊快来看看吧

    #### 六、泛型代码与虚拟机 尽管Java语言支持泛型,但在JVM层面,所有对象都是属于普通类的。这意味着编译器会在编译时擦除泛型信息,只保留原始类型。为了保证类型安全,编译器会插入必要的类型转换操作。 **示例...

    集合与泛型

    - **目的**:确保Java虚拟机(JVM)与旧版Java代码兼容,同时保留类型安全性的优点。 #### 集合概述 - **集合定义**:集合是一个用于存储一组对象的数据结构,这些对象称为元素。Java提供了两种主要的集合类型:数组...

    Java基础篇:泛型.pdf

    泛型类的实例化必须保证操作原来泛型位置的结构与指定的泛型类型一致。 泛型类的不同引用不能相互赋值,这是因为泛型信息在编译时期会被擦除,所以在运行时期,所有泛型类的实例都会被当作同一类型处理。尽管在代码...

    泛型实现小例

    由于Java虚拟机(JVM)不支持泛型,因此在编译后,所有的类型参数都会被替换为它们的边界类型或者Object,这个过程称为类型擦除。这意味着在运行时,我们无法通过反射或其他方式获取到泛型信息,但编译时的类型检查...

    java泛型深入.pdf

    在JVM内部,所有的泛型信息都会在编译时被擦除,这种机制被称为类型擦除(Type Erasure),即在虚拟机中泛型类型参数的任何信息都不保留,使得在运行时的性能不会受到影响。 类型擦除意味着`List&lt;String&gt;`和`List...

    Java泛型编程最全总结

    由于Java的虚拟机不支持泛型,所以在编译后,所有的泛型信息都会被擦除,替换为具体的类型,如`ArrayList&lt;String&gt;`会被转化为`ArrayList&lt;Object&gt;`。这就意味着在运行时无法通过反射获取到泛型信息,因此泛型主要在...

    JVM如何理解Java泛型类.doc

    然而,对于Java虚拟机(JVM)来说,它实际上并不理解泛型的概念。所有的泛型信息在编译阶段就被擦除了,留下的只是普通的Java类和方法。本文将深入探讨Java泛型类的工作原理以及JVM是如何处理这些泛型类的。 #### 二...

    Java13 语言规范与虚拟机规范

    Java 13 语言规范与虚拟机规范是深入理解Java编程平台核心的两份关键文档。它们为开发者提供了关于如何编写、编译和运行Java程序的权威指导。这份压缩包包含的是官方英文原版,分别为"Java Language Specification, ...

    Java泛型梳理.

    - **类型擦除的原理**:为了确保与旧版Java代码的兼容性,Java虚拟机(JVM)在运行时并不识别泛型信息,而是通过类型擦除将泛型类型转换为原始类型。原始类型指的是未指定类型参数的具体类型。 - **泛型类的翻译**:...

    JDK1.5的泛型实现.zip

    7. **野蛮类型**:在无法确定具体类型或者需要与非泛型代码交互时,可以使用类型参数的原始类型,称为“野蛮类型”,如 `List` 而不是 `List&lt;String&gt;`。然而,这会失去类型检查,可能导致ClassCastException。 8. *...

    无涯教程(LearnFk)-Java-泛型教程离线版.pdf

    这些约定使得泛型代码更易读易懂。 泛型不仅限于类,还可以用于方法。泛型方法允许定义方法的返回类型或参数类型为泛型。例如,在示例代码中的`add`方法,它接受一个T类型的参数,这就允许调用者传递不同类型到同一...

    565.563.JAVA基础教程_泛型与File-为什么要使用泛型(565).rar

    2. **类型擦除:** Java的泛型是伪泛型,因为Java虚拟机(JVM)并不直接支持泛型。在编译后,所有的类型参数都会被替换为它们的边界类型或者是Object,这个过程称为类型擦除。 3. **边界约束:** 我们可以限制类型...

    反射操作注解与反射操作泛型.docx

    反射操作注解与反射操作泛型 在 Java 编程中,反射操作和泛型是两个重要的概念。反射操作是指在运行时检查和修改类、对象、方法、字段等信息的能力,而泛型是指在编译时检查和限制类型的能力。本文将详细介绍反射...

    C#泛型专题

    - **C# 的泛型实现:**C# 2.0 版本开始支持泛型,并且在虚拟机级别提供了支持。这使得泛型更加易于理解和使用,虽然与 C++ 的模板相比功能较弱,但仍然非常实用。 - **Java 5 的泛型实现:**尽管 Java 5 开始支持...

    一种抽象泛型机制的新型Java实现.pdf

    例如,通过自动类型转换规则简化泛型的使用,或者通过某些工具自动将高级泛型概念转换为Java泛型代码,从而实现代码的自动生成。 泛型编程的另一个重要方面是算法构件的可重用性。算法构件如果使用了泛型机制,则...

    编译虚拟机的编译程序.zip

    本文将深入探讨"编译虚拟机的编译程序"这一主题,尤其是与C#语言相关的知识。 首先,让我们了解什么是编译器。编译器是一种计算机程序,它的主要任务是将源代码(程序员用高级编程语言如C#编写的代码)转换为机器可...

Global site tag (gtag.js) - Google Analytics