泛型思想最早在C++语言的模板(Templates)中产生,Java后来也借用了这种思想。虽然思想一致,但是他们存在着本质性的不同。

C++中的模板是真正意义上的泛型,在编译时就将不同模板类型参数编译成对应不同的目标代码,List和List是两种不同的类型,这种泛型被称为真正泛型。

这种泛型实现方式,会导致类型膨胀,因为要为不同具体参数生成不同的类。

Java中List和List虽然在源代码中属于不同的类,但是编译后的字节码中,他们都被替换成原始类型,而两者的原始类型的一样的(List),所以在运行时,List与List就是同一个类。

Java中的泛型是一种特殊的语法,通过类型擦除实现,这种泛型称为伪泛型。

类型擦除,是指将泛型类型实例关联到同一份字节码上。编译器只为泛型类型生成一份字节码,并将其实例关联到这份字节码上。

类型擦除的关键在于从泛型类型中清除类型参数的相关信息,并且再必要的时候添加类型检查和类型转换的方法。

List intList = new ArrayList<>();

intList.add(3);

List strList = new ArrayList<>();

strList.add("Hello");

System.out.println(intList.getClass()== strList.getClass()); //输出结果为true

intList与strList都属于同一个类。

创建一个只能存储Integer的ArrayList对象,在add一个整型数值后,利用反射调用add(Object o)add一个asd字符串,此时运行代码不会报错,运行结果会打印出1和asd两个值。这时再里利用反射调用add(Integer o)方法,运行会抛出codeNoSuchMethodException异常。这充分证明了在编译后,擦除了Integer这个泛型信息,只保留了原始类型。

创建一个List对象intList,利用反射调用其add()方法,向intList中添加一个String类元素,运行代码不会报错。

List intList = new ArrayList<>();

intList.add(3);

intList.getClass().getMethod("add", Object.class).invoke(intList, "Hello");for (int i = 0; i < intList.size(); i++) {

System.out.println(intList.get(i));

}//输出结果为//3//Hello

这说明在编译后,擦出了Integer这个泛型信息,intList为原始类型List。

修改代码getMethod("add", Object.class),改为getMethod("add", Integer.class)

//NoSuchMethodException:

intList.getClass().getMethod("add", Integer.class).invoke(intList, "Hello");

运行报错,intList的类List中没有("add", Integer.class)方法,只有("add", Object.class)。

自动类型转换

Java的泛型除了类型擦除之外,还会自动生成checkcast指令进行强制类型转换。

List intList = new ArrayList<>();

intList.add(3);int a = intList.get(0);

使用intList的get方法返回的是Integer类型的对象。

java泛型的实现和原理_java 泛型实现原理相关推荐

  1. java泛型的作用和实现原理_java泛型的作用及实现原理

    一.泛型的介绍 泛型是Java 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法. Ja ...

  2. java泛型的上界和下界_java泛型中的上界(extend)和下界(super)

    泛型中上界和下界的定义 上界 extend Fruit> 下界 super Apple> 上界和下界的特点 上界的list只能get,不能add(确切地说不能add出除null之外的对象, ...

  3. java 递归原理_Java中递归原理实例分析

    本文实例分析了Java中递归原理.分享给大家供大家参考.具体分析如下: 解释:程序调用自身的编程技巧叫做递归. 程序调用自身的编程技巧称为递归( recursion).递归做为一种算法在程序设计语言中 ...

  4. java的两种运行机制_Java☞JVM工作原理

    参考博客:1 2 3 JVM工作原理 java虚拟机体系结构 Java平台由Java虚拟机和Java应用程序接口搭建,Java语言则是进入这个平台的通道,用Java语言编写并编译的程序可以运行在这个平 ...

  5. java synchronized 原理_Java Synchronized的原理

    我们先通过反编译下面的代码来看看Synchronized是如何实现对代码块进行同步的: public classSynchronizedDemo{public voidmethod(){synchro ...

  6. java能够运行的原理_JAVA程序运行原理分析(一)

    作为JAVA的开发人员,需要知道JAVA是如何运行的,这个需要好好思考下. (一)class文件内容 class文件包含JAVA程序执行的字节码,也就是说程序的执行是通过class里面的内容进行执行的 ...

  7. java虚拟机堆栈工作原理_java虚拟机工作原理?

    展开全部 从宏观上介绍一下Java虚拟机的e5a48de588b662616964757a686964616f31333363373731工作原理.从最初编写的Java源文件(.java文件)是如何一 ...

  8. java map原理_Java HashMap底层原理分析

    前两天面试的时候,被面试官问到HashMap底层原理,之前只会用,底层实现完全没看过,这两天补了补功课,写篇文章记录一下,好记性不如烂笔头啊,毕竟这年头脑子它记不住东西了哈哈哈.好了,言归正传,今天我 ...

  9. java虚拟机工作原理_Java虚拟机工作原理具体解释

    一.类载入器 首先来看一下java程序的运行过程. 从这个框图非常easy大体上了解java程序工作原理.首先,你写好java代码,保存到硬盘其中.然后你在命令行中输入 javac YourClass ...

最新文章

  1. 如何设置不一样的奇偶页页眉?
  2. 程序员应该知道的七个图形工具
  3. 短信服务模块工期估算
  4. 程序员数学基础【二、时间复杂度】(Python版本)
  5. 【Linux分享】Linux常用命令+教程分享
  6. python算法基础教程_Python程序设计与算法基础教程(第2版)-微课版
  7. wget下载的文件在哪里
  8. 熊海cms v1.0 SQL注入漏洞复现
  9. 【算法】路径规划中的Dijkstra(狄克斯特拉)与A星算法
  10. 将VSCode设置成中文
  11. 汉字转拼音(不带音调)
  12. MATLAB语音端点检测
  13. Java并发编程进阶——并发锁
  14. 浅谈用KUSTO查询语言(KQL)在Azure Synapse Analytics(Azure SQL DW)审计某DB账号的操作记录
  15. 进入51.com个人主页
  16. 奥维查看行政边界_【百度地图API】如何获取行政区域的边界? (转载)
  17. 七八个星天外,两三点雨山前 (琐记)
  18. 只有300万预算,能在深圳买到什么样的二手房?分析20778套二手房
  19. 【linux shell 相关】-8
  20. eth一张_现在以太坊合约一张是多少钱?

热门文章

  1. 取消tableView多余的横线
  2. 微信小程序之录音与播放功能(完整示例demo)
  3. wireshark-wincap安装问题
  4. Promise的实例用法
  5. 活动目录在构建核心过程中的八个关键点(下)
  6. MVC5 + EF6 完整入门教程三
  7. NSUserDefaults的用法
  8. 使用editcap命令将ERF格式转换为pcap格式
  9. 服务器产品选型与性价比图解
  10. CART树 python小样例