Java泛型解析(03):虚拟机执行泛型代码_第1页
Java泛型解析(03):虚拟机执行泛型代码_第2页
Java泛型解析(03):虚拟机执行泛型代码_第3页
Java泛型解析(03):虚拟机执行泛型代码_第4页
Java泛型解析(03):虚拟机执行泛型代码_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

重庆达渝仁科技官网 JavaJava 泛型解析泛型解析 03 03 虚拟机执行泛型代码 虚拟机执行泛型代码 Java 虚拟机是不存在泛型类型对象的 所有的对象都属于 普通类 甚至在泛型实现的早起版本中 可以将使用泛型的程序 编译为在 1 0 虚拟机上能够运行的 class 文件 这个向后兼容性 后期被抛弃了 所以后来如果用 Sun 公司的编译器编译的泛型代 码 是不能运行在 Java5 0 之前的虚拟机的 这样就导致了一些 实际生产的问题 如一些遗留代码如何跟新的系统进行衔接 要 弄明白这个问题 需要先了解一下虚拟机是怎么执行泛型代码的 虚拟机的一种机制 擦除类型参数 并将其替换成特定类 型 没有指定特定类型用 Object 代替 如前文中的 Couple类 虚拟机擦除后 code01 java java view plaincopyprint 1 public class Couple 2 private Object wife 3 private Object husband 4 5 public Couple Object wife Object husband 6 this wife wife 7 this husband husband 8 9 public void setWife Object wife this wife wife 10 public void setHusband Object husband this husband husband 11 重庆达渝仁科技官网 12 public Object getWife return wife 13 public Object getHusband return husband 14 类型参数 T 是一个任意类型的 所以擦除后用 Object 代替 了 不管是 Couple或者 Couple擦除后都成为 了原始类 Couple 类 这就好比回到了泛型引入 Java 之前的普通 类 所以这里重点围绕着擦除类型参数擦除类型参数这个机制展开讲解 如有对类型参数有类型限定会怎么替换呢 擦除类型参数机 制告诉我们 使用限定的类型代替 如果有多个 使用第一个代 替 看一段代码 code02 java java view plaincopyprint 1 public class Period T extends Comparable 3 private T end 4 5 public Period T one T two 6 if pareTo two 0 begin two end one 7 else begin one end two 8 9 code02 擦除后 Period 的原始类型如下 code03 java java view plaincopyprint 1 public class Period 2 private Comparable begin 重庆达渝仁科技官网 3 private Comparable end 4 5 public Period Comparable one Comparable two 6 if pareTo two 0 begin two end one 7 else begin one end two 8 9 思考一下 如果将 Period T extendsextends Comparable 2 Employee wife couple getWife 擦除后 getWife 返回的是 Object 类型 然后虚拟机会插 入强制类型转换 将 Object 转换为 Employee 所以虚拟机实际 上执行了两天指令 1 调用 Couple getWife 方法 2 将 Object 转换成 Employee 类型 再来看看虚拟机执行泛型方法的时候发生了什么 泛型方法 重庆达渝仁科技官网 如 code05 java java view plaincopyprint 1 public static T extends Comparable max T arrays 2 擦除后成了 3 public staticComoparable max Comparable arrays 但是泛型方法的擦除会带来两个复杂的问题 且看第一个实例 一个实例 code06 java java view plaincopyprint 1 public class Period T extends Comparable 3 private T end 4 5 public Period T one T two 6 if pareTo two 0 begin two end one 7 else begin one end two 8 9 public void setBegin T begin this begin begin 10 public void setEnd T end this end end 11 public T getBegin return begin 12 public T getEnd return end 13 14 public class DateInterval extends Period 15 16 public DateInterval Date one Date two 17 super one two 18 19 public void setBegin Date begin 20 super setBegin begin 重庆达渝仁科技官网 21 22 DateInterval类型擦除后 Period 中的方法变成 publicpublic voidvoid setBegin Object begin 而 DateInterval 中的方法还是 publicpublic voidvoid setBegin Date begin 所以 DateInterval 从 Period 中继承了 publicpublic voidvoid setBegin Object begin 而自身又存在 publicpublic voidvoid setBegin Date begin 方法 用户使用时问题 发生了 code07 java java view plaincopyprint 1 Period period new DateInterval 2 period setBegin new Date 这里因为 period 引用指向了 DateInterval 实例 根据多态 性 setBegin 应该调用 DateInterval 对象的 setBegin 方法 可 是这个擦除让 Period 中的 publicpublic voidvoid setBegin Object begin 被调用 导致了擦除与多态发生了冲突 怎么办呢 虚拟机此 时会在 DateInterval 类中生成一个桥方法 bridge method 调用 过程发生了细微的变化 code08 java java view plaincopyprint 重庆达渝仁科技官网 1 public void setBegin Object begin 2 setBegin Date begin 3 有了这个合成的桥方法以后 code07 中对 setBegin 的调用步 骤如下 1 调用 DateInterval setBegin Object 方法 2 DateInterval setBegin Object 方法调用 DateInterval setBegin Date 方法 发现了吗 当我们在 DateInterval 中增加了 getBegin 方法 之后会是什么样子的呢 是不是 Peroid 中有一个 Object getBegin 的方法 而 DateInterval 中有一个 Date getBegin 方法呢 这两个方法在 Java 中是不能同时存在的 可是 Java5 以 后增加了一个协变类型 使得这里是被允许的 看看 DateInterval 中 getBegin 方法就知道了 code09 java java view plaincopyprint 1 Override 2 public Date getBegin return super getBegin 这里用了 Override 说明是覆盖了父类的 Object getBegin 方 法 而返回值可以指定为父类中的返回值类型的子类 这就是协变 类型 这是 J

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论