简单的java泛型总结

Posted jimmylearning

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单的java泛型总结相关的知识,希望对你有一定的参考价值。

  1. 定义泛型类
    • 泛型类中的元素应该是泛型类型
    • 使用具体的替换类型变量就可以实例化泛型对象
  2. 泛型方法
    • public static<T> T getMiddle(T... a),如此形式
    • 调用泛型方法:String middle = ArrayAlg.<String>getMiddle()
    • 大多数时候,可以忽略<String> ,即ArrayAlg.getMiddle()
  3. 类型变量的限定
    • 如果是需要调用特殊接口的数据类型,那么就需要以以下形式
    • public static<T extends Comparable> T min(T[] a)
    • 千万注意,T是后面的东西的子类型,可以是接口或者类
    • 限定符使用&进行分割,例如T extends Comparable&serializable
    • 可以继承多个接口以及一个超类,如果有超类,那么就把超类放在第一位
  4. 泛型代码以及虚拟机
    1. 类型参数擦除
      • 如果变量没有限定,那么原始类型就是Object
      • 将没有方法的接口放在边界列表的末尾
    2. 翻译泛型表达式
      • 如果是擦出返回类型,编译器会自动插入强转
      • Pair<Employee> buddies=...
      • Employee buddy = buddies.getFirst
      • 上面的在虚拟机中就调用了对Pair.getFirst的调用,将返回的Object类强制转换为Employee类型
    3. 翻译泛型方法
      • 桥方法-->是编译器为了维护多态性的工具
      • 虚拟机中没有泛型,有且只有普通的类和方法
      • 为保持类型安全,必要时插入强制类型转换
    4. 调用遗留代码
  5. 约束以及局限性
    1. 不能用基本数据类型进行实例化
      • Pair(Double) √ Pair(double) ×
    2. 运行时类型检查仅适用于原始数据类型
      • a instanceof Pair<T> x
      • a instanceof Pair<String> x
      • Pair<String> a = (Pair<String) b x
      • getclass方法返回的总是原始数据类型
    3. 不能创建参数化类型的数组
      • Pair<String> table = new pair<String>[10] x
      • 有且只有一种方法 ArrayList<Pair<String>>
    4. 不能实例化类型变量
      • 让调用者提供一个构造器表达式
      • Pair<String> p = Pair.makePair(String::new)
      • makePair(Supplier<T> constr)
      • return new Pair<>(constr.get(),constr.get())
    5. 不能创建泛型数组
      • 无法进行,但是。
      • public static<T extends Comparable> T[] minmax(IntFuction<T[] constr ,T... a)
      • 调用时,则为String[] ss = ArrayAlg.minmax(String[]::new,"Tom","Jim","Harry").
    6. 泛型类静态上下文中类型变量无效
      • 即只要是泛型类中的东西,被static修饰,就不能有T
    7. 不能抛出或者捕获泛型类实例
      • 泛型类拓展Throwable是不合法的
      • 无法捕获泛型数据示例T t是无法捕获的
      • public static<T extends Throwable> void doWork(Class<T> t)
      • catch(T e) x
      • 使用类型变量是合法的
      • public static<T extends Throwable> void doWork(T t) throws T
      • catch (Throwabe realCause) √
    8. 擦出后的冲突
      • 要想支持擦除的转换,就需要强行限制一个类或类型变量不能同时为两个接口类型的子类,而这两个接口是同一接口的不同参数化!
      • class Employee implements Comparable<Employee>
      • class Manager extends Employee implements Comparable<Manager>
      • 此时,Manager就会实现Comparable<Employee>和Comparable<Manager>
  6. 泛型类型的继承规则
    1. Pair<Employee>和Pair<Manager>没有什么关系
  7. 通配符类型
    1. 概念:<?extends Employee>即表示任何Pair类型
      • Pair<Manager>是Pair<? extends Employee>的子类型
    2. 通配符的超类型限定
      • <? super xx>
    3. 无限定的通配符
      • Pair<?> -->无法调用set方法

以上是关于简单的java泛型总结的主要内容,如果未能解决你的问题,请参考以下文章

Java基础系列:关于泛型的简单总结

java集合,泛型简单总结

Java泛型使用的简单介绍

JAVA数据结构List的基本用法

Java基础总结三(泛型异常)

Java基础总结三(泛型异常)