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

【Java范型七】范型消除

 
阅读更多

范型是Java1.5引入的语言特性,它是编译时的一个语法现象,也就是说,对于一个类,不管是范型类还是非范型类,编译得到的字节码是一样的,差别仅在于通过范型这种语法来进行编译时的类型检查,在运行时是没有范型或者类型参数这个说法的。

范型跟反射刚好相反,反射是一种运行时行为,所以编译时不能访问的变量或者方法(比如private),在运行时通过反射是可以访问的,也就是说,可见性也是一种编译时的行为,在运行时,JVM中的字节码对彼此都是可见的。

 

Java在将源代码编译后,自动去除了关于范型的信息,范型是编译时的语法现象,这给范型的处理带来一些很不直观的结果。

 

 范型类不能用于instanceof判断

 

package com.tom.lang.generics;


public class Generics<T> {
    public static void main(String[] args) {
        Generics<String> stringGenerics =new Generics<String>();
        if (stringGenerics instanceof Generics<String>) {//编译错, 范型类不能用于instanceof运算符
            
        }
        
    }
}

 

 范型参数不能作为方法签名的一部分信息

package com.tom.lang.generics;


public class Generics<T> {
    public void method(Generics<String> obj) { //编译错,两个method冲突

    }

    public void method(Generics<Integer> obj) {

    }
}

 

范型类不能获得Class对象

 

Data<Integer>.class //范型类加.class来获得它的class对象

 

 

范型处理困难

Gson这个GSON算是比较优雅的解决了范型的问题,但是范型的运行时消除这个特性还是给使用Gson带来一些额外的代码,比如如下的代码不用任何额外处理时

 

 

package com.tom.lang.generics;

import com.google.gson.Gson;

class Point {
    private int x;
    private int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }
}

class Data<T> {
    private T data;

    public Data(T data) {
        this.data = data;
    }
    public T getData() {
        return data;
    }
}

public class DataTest {
    public static void main(String[] args) {
        Data<Point> d = new Data<Point>(new Point(100,200));
        String str = new Gson().toJson(d);
        System.out.println(str);
        Data<Point> dd = new Gson().fromJson(str, Data.class);
        //虽然dd看上去像是一个带有参数类型为Point的Data范型类变量,实际上运行时得到的结果是,Data含有一个data字段,但是这个字段
        //是TreeMap类型的,由于运行的范型消除,所以,即使返回的dd中的data字段是Map类型,仍然不会报错!
        //Point p = dd.getData(); //运行时,类型转换失败
        Map map = dd.getData(); //成功
    }
}


 

 上面的正确做法

 

 

package com.tom.lang.generics;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;

class Point {
    private int x;
    private int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }
}

class Data<T> {
    private T data;

    public Data(T data) {
        this.data = data;
    }
    public T getData() {
        return data;
    }
}

public class DataTest {
    public static void main(String[] args) {
        Data<Point> d = new Data<Point>(new Point(100,200));
        String str = new Gson().toJson(d);
        System.out.println(str);
        Type type = new TypeToken<Data<Point>>(){}.getType();//将范型类型包装到TypeToken中保存
        Data<Point> dd = new Gson().fromJson(str, type); //转型正确
        Point p = dd.getData();//可以正确取值
    }
}


 

 

 

 

 

 

分享到:
评论

相关推荐

    Java 范型Java 范型.doc

    Java 范型Java 范型

    Java 范型攻略篇

    ### Java范型攻略篇:深度解析与应用 #### 一、引言:Java范型的引入 在Java的发展历程中,范型(Generics)的引入标志着语言设计上的一个重要里程碑。自Java 1.5发布以来,范型成为了Java语言的重要特性之一,极...

    JAVA范型指南中文版

    - **避免强制类型转换**:使用泛型可以消除不必要的类型转换,提高代码的稳定性。 - **容器类的使用**:Java集合框架中的类如`ArrayList`、`LinkedList`等都支持泛型,确保元素的类型安全。 总之,Java泛型通过...

    java范型[参考].pdf

    此外,Java泛型还有擦除的概念,即在编译后,泛型信息会被消除,转而使用原始类型。这是因为Java的泛型是类型安全的,但不是运行时类型检查的。尽管如此,泛型仍然在编译时提供了类型检查,使得我们能够在开发阶段就...

    java范型[参照].pdf

    2. **消除类型转换**:泛型对象可以直接使用指定的类型,无需手动转换。 3. **代码重用**:泛型可以应用于不同的数据类型,提高了代码的可复用性。 4. **强类型提示**:使得代码更易读,因为类型信息在编译时已经...

    七周七语言_理解多种编程范型-[PDF]

    《七周七语言:理解多种编程范型》共介绍了七种不同的编程语言。对于每种语言,分别介绍了各自的特性、应用,以及编程入门知识和关键编程范型,还带领读者使用能够代表该语言最重要特性的技术,解决某个不寻常的问题...

    java范型视频

    泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是...

    java范型学习

    2. **消除类型转换**:泛型集合可以直接存储和检索指定类型的对象,无需手动转换。 3. **代码重用**:泛型允许编写通用的代码,适应多种数据类型。 掌握Java泛型对于高效、安全地使用Java集合框架至关重要,它也...

    java 泛型类的类型识别示例

    在Java编程语言中,泛型(Generics)是一种强大的特性,它允许我们在编写代码时指定容器(如集合)可以存储的数据类型。这提高了代码的安全性和效率,因为编译器可以在编译时检查类型,避免了运行时...

    Java程序设计范型和枚举PPT教案学习.pptx

    Java程序设计范型和枚举是Java编程中的关键概念,它们极大地增强了代码的类型安全性和重用性。本文将深入探讨这两个主题。 首先,我们来看什么是范型(Generics)。范型是Java SE 5.0引入的一个特性,它允许在类、...

    七周七语言:理解多种编程范型 中文高清版

    《七周七语言:理解多种编程范型》是一本旨在帮助程序员深入了解不同编程范型的著作。这本书由Bruce A. Tate撰写,于2012年由人民邮电出版社出版。作者通过详细介绍七种不同的编程语言,揭示了每种语言的核心特性和...

    C++多范型设计

    《C++多范型设计》是一本深入探讨C++编程语言中模板技术的专著,由知名软件工程师James O. Coplien撰写,并由鄢爱兰、周辉等翻译成中文版,ISBN号为9787508318240。这本书的核心主题是C++中的泛型编程,它是C++编程...

    论文研究-消息传递范型与C/S范型双范型的主数据管理机制 .pdf

    本文提出的基于消息传递范型和客户机/服务器(Client/Server,简称C/S)范型双范型的主数据管理机制,能够有效解决MDM面临的问题。 消息传递范型是计算机科学中的一个基本概念,用于描述进程间通信的方式。在这范型...

    七周七语言 理解多种编程范型

    《七周七语言:理解多种编程范型》这本书是一本编程领域的经典之作,旨在帮助读者在短时间内接触并理解多种不同的编程范型。编程范型是编程语言的核心思想和设计模式,理解它们对于提升编程能力至关重要。书中涵盖了...

    范型程序设计与 STL.pdf

    《范型程序设计与 STL》是一本深入探讨C++编程中的关键概念和技术的书籍,主要聚焦于范型(Generic Programming)和标准模板库(Standard Template Library,简称STL)。范型编程是一种强大的软件开发方法,它允许...

    范型参考 (1).java

    范型参考 (1).java

    范型参考 (2).java

    范型参考 (2).java

    《分布式系统原理与范型》.pdf

    《分布式系统原理与范型》作为一本系统介绍分布式系统基本原理与实践应用的书籍,涵盖了分布式系统设计与实现的核心理念。分布式系统指的是由多个可以独立运行的计算单元构成的系统,这些计算单元通过通信网络相互...

    用Java Socket实现一个简单的基于P2P范型的即时聊天系统。

    在本文中,我们将深入探讨如何使用Java的Socket编程来实现一个简单的基于P2P(Peer-to-Peer)范型的即时聊天系统。P2P网络架构允许每个节点既是客户端也是服务器,这种模式使得数据传输更加分散,提高了系统的可扩展...

Global site tag (gtag.js) - Google Analytics