zoukankan      html  css  js  c++  java
  • Java中的泛型

    一、泛型类和泛型方法

    public class Pair<T>{...}

    public static <T> T getMiddle(T[] a){...}

    public static <M> M,<V> V myCompate(M am,V av){...}

    public static <T extends Comparable & Serializable> T getMiddle(T[] a)
    增加限定符,之间用&分隔;可以有多个接口,如果有类继承关系,只能有一个,并且必须放在首位

    二、泛型代码和虚拟机

    虚拟机中的对象全部是普通的类对象,没有泛型对象。泛型只是作编译检查?

    泛型对象首先要进行类型擦除生成原始类型,原始类型的名字就是删去类型参数后的泛型类型名。

    public class Pair{...}

    public static Object  getMiddle(Object[] a){...}

    public static Object   myCompate(Object  am,Object  av){...}

    public static <Comparable > getMiddle(Comparable[] a) 

    程序使用泛型的时候,会强制进行类型转换,转换为实例化类型,再进行处理。

    例如double inst[];getMiddle(inst),会先将Object[]转换为Double[]。

    三、约束与限定

    1、不能用基本类型实例化类型参数

    2、运行时类型查询只返回原始类型

    instanceof、强制类型转换、getClass()...

    3、不能抛出也不能捕获泛型类型的实例

    4、参数化类型的数组不合法

    Pair<String>[] table = new Pare<Sting>[10];//ERROR

    5、不能实例化类型变量

    6、泛型类的静态上下文中类型变量无效

    四、泛型类型的继承规则 

    1、Manger是Employee的子类,但是Pair<Employee>和Pair<Manager>没有啥子关系

    2、ArrayList<Manager>是List<Manger>的子类

     

    五、通配符类型

    1、Pair<? extends Employee>表示类型参数是Employee子类的Pair类型;Pair<Manger>是Pair<? extends Employee>的子类;可以使用返回值,但是不能为方法提供参数

    Pair<? extends Employee> = new Pair<Manger> //OK

    void setField(Pair<? extends Employee>) //参数不能是Pair<Manger>

    2、Pair<? super Manger>表示类型参数是Manger超类的Pair类型;可以为方法提供参数,但是不能使用返回值

    void setField(Pair<? super Manger>)//参数可以是Pair<Employ>

    Pair<? super Manger> = Pair<Employ> //ERROR

    参考文献

    《java核心技术 卷1:基础知识》

  • 相关阅读:
    redis 缓存验证码 步骤
    方法返回值 前面的<T>是什么?
    spring boot的运行原理
    在本地tomcat中调试Spring boot项目遇到的一些问题
    UEditor中上传图片的步骤
    总结彻底解决Spring MVC+Mybatis中文乱码问题
    ueditor1.4.3二次开发添加自定义Dialog
    UEditor之图片上传如何和真实项目结合
    UEditor之实现配置简单的图片上传示例 (转)
    Java比较运算符
  • 原文地址:https://www.cnblogs.com/mingziday/p/4979601.html
Copyright © 2011-2022 走看看