`
chensl
  • 浏览: 59440 次
  • 性别: 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泛型编程指南.pdf

    #### 一、绪论:理解Java泛型的重要性与背景 **1.1 泛型的基本概念** 泛型是一种在编程语言中支持编写类型安全的通用函数或类的能力。在Java中引入泛型的主要目的是为了提供更安全、更灵活的类型处理方式。 **1.2...

    集合与泛型

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

    Java基础篇:泛型.pdf

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

    细细品味C#(泛型专题)

    - **泛型约束**:为了确保泛型代码的正确性和效率,可以通过约束指定泛型参数必须满足的条件,如`class`、`struct`、`new()`等。 - **协变与逆变**:Java中的`extends`和`super`关键字体现了泛型的协变和逆变特性,...

    泛型实现小例

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

    java泛型深入.pdf

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

    Java泛型深入解析:类型安全的灵活编程

    当泛型代码需要转换为可以运行在JVM上的字节码时,编译器会生成所谓的桥接方法,这些桥接方法使得擦除泛型类型的代码能够在运行时保持类型安全和多态性。 理解泛型的工作原理和高级特性,不仅有助于编写更安全、更...

    Java泛型编程最全总结

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

    java.泛型与反射.md

    Java中的泛型和反射机制是Java语言中非常重要的两个特性,它们各有用武之地,但又可以相互配合...在实践中,合理地选择使用泛型和反射的时机,结合对Java虚拟机运行机制的理解,能够帮助我们写出既高效又健壮的代码。

    JVM如何理解Java泛型类.doc

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

    Java13 语言规范与虚拟机规范

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

    JAVA面试基础篇章-泛型

    泛型为Java集合框架提供了更安全的类型检查机制,减少类型转换的需要,同时,它通过类型擦除机制与Java虚拟机兼容。 泛型可以定义为一种参数化类型,它在创建集合时,能够指定集合元素的数据类型。例如,使用泛型...

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

Global site tag (gtag.js) - Google Analytics