一点点core java的笔记-泛型程序设计

泛型程序设计

类型参数: <string>可读性,错误检查,避免强制转换。

定义简单泛型类:

 

 
  一点点core java的笔记-泛型程序设计

 

 

E:集合的元素类型
K, V 表关键字与值类型
T, U, S 任意类型

泛型方法: public static <T> T get Middle
(T... a)
调用时在方法前的尖括号加上具体类型。

类型变量限定:

public static <T extends Comparable> T min ( T... a)
为什么不是implements? T 是绑定类型的子类型,可类可接口。

类型擦除:自动提供泛型类型的原始类型,无限定即为 Object。

 

 
  一点点core java的笔记-泛型程序设计

 

 

翻译泛型表达式:由于类型擦除,编译器会加上把返回的类型强转为原本类型。

翻译泛型方法:P319,类型擦除后可能与多态冲突,编译器会自动生成桥方法,覆盖超类中的方法。

 

 
  一点点core java的笔记-泛型程序设计

 

 

泛型的约束

  1. 无法用基本类型,如<double>(由于类型擦除)
  2. 运行时查询只产生原始类型 (类型擦除)
  3. 无参数化类型数组

Varags 警告: 可变参数方法若有泛型,可加Safe Varags (安全变量) 注释消除警告。

无法实例化:不能用new T (...),解决方法为提供构造器表达式。

 

 
  一点点core java的笔记-泛型程序设计

 

 

禁止用有类型变量的静态域\方法

泛型类型的继承:
S, T的联系与 Pair < S > , Pair < T >无关。
可将参数化类型转换为原始类型。
泛型类可 extends/ implement 其它泛型类。

 

 
  一点点core java的笔记-泛型程序设计

 

 

通配符:
Pair <Employee> 改为Pair <? extends Employee>,这样可传入Pair <Manager>。

可区分安全的访问器与不安全的更改器
? extends 无法用于匹配,但能识别返回类型。

通配符的超类型限定:? super Manager限制为Manager 的超类,

 

一点点core java的笔记-泛型程序设计

 

P 333另一种应用

通配符捕获:

反射和泛型:P337