Java泛型解析虚拟机执行泛型代码.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Java泛型解析(03):虚拟机执行泛型代码 Java虚拟机是不存在泛型类型对象的,所有的对象都属 于普通类,甚至在泛型实现的早起版本屮,可以将使用泛型的程序 编译为在1. 0虚拟机上能够运行的class文件,这个向后兼容性后 期被抛弃了,所以后来如果用Sun公司的编译器编译的泛型代码, 是不能运行在Java5. 0之前的虚拟机的,这样就导致了一些实际生 产的问题,如一些遗留代码如何跟新的系统进行衔接,要弄明白这 个问题,需要先了解一下虚拟机是怎么执行泛型代码的。 虚拟机的--种机制:擦除类型参数,并将其替换成特 定类型,没有指定特定类型用Object代替,如前文中的CoupleT 类,虚拟机擦除后: [codeOl J [java] view pl a incopyprint? 1? public class Couple { 2. private Object wife ; 3. private Object husband ; 4. 5. public Couple(Object wife, Object husband) { 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 .j 11. 12. public Object getWifeO {return wife;} 14. } 类型参数T是一个任意类型的,所以擦除后用Object代 替了。不管是CoupleEmployee或者CoupleString擦除后都成 为了原始类Couple类,这就好比回到了泛型引入Java之前的普通 类。所以这里重点围绕着摻隙类蜚參数这个机制展开讲解。 如有对类型参数有类型限定会怎么替换呢?擦除类型参 数机制告诉我们,使用限定的类型代替,如果有多个,使用第一个 代替,看一段代码: [code02] [java] view plaincopypjrint? code02Period code02 Period的原始类型如下: 1. public class PeriodT extends ComparableT Serializable { 2. private T begin; 3. private T end; 4. 5. public Period (T one, T two) { 6. if (one. compareTo(two) 0) {begin 二 two;end one; 7. )else {begin 二 one;end 二 two:) 8. } 9. } [code03.] [java] view plaincopyprint? 1? public class Period { private Comparable begin; 3. private Comparable end; 4. 5. public Period(Comparable one, Comparable two) { if (one. compareTo(two) 0) {begin 二 two; end =one; 7. } else {begin = one; end = two;} } 9. } 思考一下,如果将 PeriodT extends ComparableT Serializable 写 成 PeriodT extends Serializable CompeErable〈T 会是怎 么样呢?同理,擦除后原始类型用第一个Serializable代替,这样进 行compareTo方法调用的时候,编译器会进行必要的强制类型转换, 所以为了提高效率,将标签接口(没有任何方法的接口,也叫tagging 接口)放在后而。 先来看看虚拟机执行表达式的时候发生了什么,如: [code04] [java] view plaincopypi^int? 1? CoupleEmployee couple = ???; 2? Employee wife = couple?gelWife(); 擦除后,getWife ()返回的是Object类型,然后虚拟机会 插入强制类型转换,将Object转换为Employee,所以虚拟机实际 上执行了两天指令: 调用 Couple. getWife0方法。 将Object转换成Employee类型。 再来看看虚拟机执行泛型方法的时候发生了什么,泛型 方法如: [code05] [java] view

文档评论(0)

ggkkppp + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档