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