zoukankan      html  css  js  c++  java
  • 2017-9-5-Java 泛型

    Java 泛型学习

    泛型可以解决数据类型的安全性问题。

    简单泛型类

    泛型方法

    在一个普通类中定义一个泛型方法

    类型变量的限定

    类或者方法对类型变量加以约束
    例如

    public <T extends Comparable>
    

    意思是将泛型参数T限制为Comparable

    Java虚拟机中泛型转换小结

    • 虚拟机中没有泛型,只有普通的类和方法
    • 所有的类型参数都会被其限定类型替换
    • 桥方法被合成来保持多态
    • 为保持类型安全性,必要时插入强制类型转换

    泛型的安全性警告

    在实例化泛型类时,如果未指定一个具体的类型参数,会提示一个不安全操作的unchecked警告信息, 但是并不会影响使用

    Java泛型的约束和局限

    • 在泛型操作中子类的泛型类型是不能用父类的泛型类型来接收的。
    • 不能用基本类型实例化类型参数,即类型参数不能为8种基本数据类型,可以使用其对应的包装类来完成。
    • 运行时类型查询只适用于原始类型,因为运行时类型擦除,虚拟机中所有的类型查询只会产生原始类型。
    • 不能创建参数化类型的数组,即不支持泛型数组。
    • varargs警告
    • 不能实例化类型变量
    • 不能在静态域或者方法中引用类型变量
    • 不能捕获或者抛出泛型类对象, 泛型类不能继承Throwable,在编译时期就会报错。
    • 类型擦除后的冲突

    泛型类型的继承规则

    通配符类型

    子类型限定通配符

    例如

    public void printBuddies(SimpleGenerics<? extends Employee> p)
    

    参数p类型都是Employee的子类限定, 泛型操作设置为一个对象的范围上限。范型上限使用extends关键字声明,表示泛型的类型可能是所指定的类型或者是此类型的子类。

    超类型限定通配符

    例如

    public void printBuddies(SimpleGenerics<? super Employee> p)
    

    参数p类型都是Employee的超类限定,即表示的是任何被Employee继承的类。
    泛型下限使用super进行声明,表示泛型的类型可能是所指定的类型,或者是此类型的父类型,或是Object(Object的是所有对象的超类)。

    无限定通配符

    可以匹配任意泛型对象

    public void printBuddies(SimpleGenerics<?> p)
    

    通配符捕获

    泛型接口

    不仅可以声明一个泛型类,也可以声明一个泛型接口,使用方式与之前相同。

    泛型接口子类实现的两种方式

    • 在子类的定义上声明泛型类型,此时子类仍然是一个泛型类
    • 直接在接口中指定具体的类型,此时子类使用时不需要再指定泛型,因为声明子类时已经明确地指定了具体类型。
  • 相关阅读:
    P1726 上白泽慧音
    P1993 小k的农场
    P1983 车站分级
    P1525 关押罪犯【二分+二分图】
    P1268 树的重量【构造】
    P1113 杂务
    F.Three pahs on a tree
    P1522 牛的旅行
    两个约束下的dp问题
    dp 最大正方形
  • 原文地址:https://www.cnblogs.com/abel-huang/p/7784085.html
Copyright © 2011-2022 走看看