`
hongjn
  • 浏览: 55269 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

Java泛型总结(三)

阅读更多

 

泛型代码和虚拟机
1)类型变量的擦除
  虚拟机并没有泛型类型的对象,所有的对象都是普通类,即使是我们看到的泛型类型(如Pair<String>),在编译后都成了普通的类型。任何时候,泛型类型都自动对应一个相应的原型(raw type),就是删除类型变量后的泛型类型名。
  如何擦除类型变量呢。对于有限定类型的,如T extends Comparable 的删除T,并替换成限定的类型Comparable ;没有限定类型的则替换成Object。
  注意到,如果有多个限定类型的呢,例如T extends Serializable & Comparable 
  这个时候,将把T替换成Serializable,因为编译器用的是限定类型中的第一个。但是,替换成Serializable,编译器在编译的时候当需要接口Comparable的compareTo方法时又需要进行强制转换,为了不影响效率,应该替换成Comparable比较好。那么,我们应该把Comparable放在前面,即:T extends Comparable  & Serializable。
  因此,我们总结出结论:为了提高效率,应该把tagging interfaces(标签接口,就是没有方法的接口)放在限定类型列表的最后。

2)泛型的翻译
  当程序调用泛型方法时,如果擦除返回类型,编译器插入强制类型转换。
  When you program a call to a generic method, the compiler inserts casts when the return type has been erased
  接着第一篇中的例子:
        Pair<Employee> pair = new Pair<Employee>();
        Employee first = pair.getFirst();
 本来getFirst方法返回的类型是T,按照上面所述的类型擦除后返回类型变为Object,编译器又自动插入Employee的强制类型转换,所以直接就得到了Employee类型了。

3)桥方法(bridge method)
  桥方法用来保持多态,解决类型擦除与多态的冲突。
  例如,存在泛型类Pair<T>
public class Pair<T> {
     private second ;

     public void setSecond(T second) {
        this. second = second;
    }
}

自定义类MyDate继承了Pair<Date>
class MyDate extends Pair<Date> {
    @Override
    public void setSecond(Date second) {
        …… ;
    }
}

在进行类型擦除后变成了:
class MyDate extends Pair { // 去掉了泛型变量Date
    @Override
    public void setSecond(Date second) {
        …… ;
    }
}
当调用setSecond方法时:
        MyDate myDate = new MyDate();
        Pair<Date> pair = myDate;
        pair.setSecond( new Date());
这里的pair声明是Pair<Date>类型,并且仅有一个方法setSecond(Object second),但它实际引用的是MyDate对象,那么语句pair.setSecond( new Date());在调用时,实际调用的是MyDate中的setSecond(Object second)方法,但是我们看到MyDate中并没有定义这个一个方法,而只有setSecond(Date second)方法。这时,动态和擦除的冲突就出现了。那么,桥方法就出现了,编译器在编译的时候,为MyDate生成这样的一个方法:
public void setSecond(Object second){ setSecond(Date) second; }
也就是,对其中的入参second做了强制转换成Date类型了。



 
2
0
分享到:
评论

相关推荐

    很好的Java泛型的总结

    很好的Java泛型的总结,看完之后你一定会知道java泛型的底层机制,你一定会学会Java泛型!

    java泛型总结

    深入理解java泛型,包括类名泛型的定义,方法泛型定义,泛型的返回

    全面总结Java泛型

    • 全面总结Ja• 全面总结Java泛型v• 全面总结Ja• 全面总结Java泛型va泛型a泛型• 全面• 全面总结Java泛型• 全面总结Java泛型总结Java泛• • 全面总结Java泛型全面总结Java泛型型• • 全面总结Java泛型全面...

    思维导图之Java泛型详解

    思维导图之Java泛型详解

    Java泛型总结(2)进阶篇

    NULL 博文链接:https://fantaxy025025.iteye.com/blog/2213815

    JAVA泛型总结

    java 泛型详解 实例 class Point class Notepad,V&gt;{ // 此处指定了两个泛型类型 } 通配符、受限泛型、泛型无法向上转型、泛型接口、泛型方法、通过泛型方法返回泛型类型实例、使用泛型统一传入的参数类型、泛型数组...

    java泛型总结.docx

    类型推断:在Java 7及以上版本中,可以使用varargs和钻石操作符来推断类型参数。例如,List[] lists = Arrays.asList(new List() {{ add("hello"); add("world"); }}); 泛型边界:可以使用泛型边界来限制类型参数的...

    全面总结Java泛型--实例

    全面总结Java泛型--实例

    Java泛型编程最全总结

    NULL 博文链接:https://qiemengdao.iteye.com/blog/1525624

    java-泛型总结【从入门到项目总结】

    关于java泛型的总结: 从入门介绍到项目使用的实际经验归纳总结得出! 从jdk5到jdk8!

    java泛型.xmind

    自己总结的java泛型的笔记,绘制了详细的思维导图,每个思维导图中均有详细的博文解释,方便大家学习和理解,免费分享给大家。适合java的爱好者和学习者

    Java 泛型总结(一):基本用法与类型擦除

    本文主要介绍了Java泛型的使用以及类型擦除相关的问题。具有很好的参考价值。下面跟着小编一起来看下吧

    Java 泛型总结及详解

    主要介绍了Java 泛型的相关资料,并附简单实例代码,需要的朋友可以参考下

    Java中泛型总结(推荐)

    主要介绍了Java中泛型总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    Java 泛型总结(二):泛型与数组

    数组与泛型的关系还是有点复杂的,Java 中不允许直接创建泛型数组。本文分析了其中原因并且总结了一些创建泛型数组的方式。具有很好的参考价值。下面跟着小编一起来看下吧

    java深度历险

    JAVA泛型 28 类型擦除 28 实例分析 29 通配符与上下界 30 类型系统 31 开发自己的泛型类 32 最佳实践 32 参考资料 33 目录 3 JAVA注解 34 使用注解 34 开发注解 35 处理注解 35 实例分析 38 参考资料 39 JAVA反射与...

    Java 泛型总结(三):通配符的使用

    在泛型的使用中,还有个重要的东西叫通配符,本文介绍通配符的使用。具有很好的参考价值。下面跟着小编一起来看下吧

    基于java中泛型的总结分析

    本篇文章介绍了,在java中泛型的总结分析。需要的朋友参考下

    泛型技术归纳

    Java泛型简明教程 泛型是Java SE 5.0中引入的一项特征,自从这项语言特征出现多年来,我相信,几乎所有的Java程序员...这就是为什么我想使用一种最简单的形式来总结一下程序员需要知道的关于Java泛型的最基本的知识。

    Java总结篇系列:Java泛型详解

    下面小编就为大家带来一篇Java总结篇系列:Java泛型详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

Global site tag (gtag.js) - Google Analytics