泛型类 泛型方法

1 泛型 意味着 编写的代码可以被很多不同类型的对象所重用
2 一个泛型类(generic class)就是具有一个或多个类型变量的类
public class Pair{ …. }
3 可以定义一个带有参数类型的简单方法
public T getMiddle(T… args){ … }
放在 返回类型前 , static 后

泛型类型 限定

1 有时候 需要对 类型参数 进行限定 ,该类必须实现了某些接口
public T getMiddle(){..}
不论是 类 还是 接口, 这里都用extends
可以有多个限定 T extends comparable & Serializable ,

类型擦除

1 Java 实现 泛型 使用的是 类型擦除, 并替换为Object ,如果有限定类型 就 替换为限定类型
当调用泛型的时候,编译器会进行强制的 类型转换
2 在擦除类型过程中,可能会与原有类型的重载方法 冲突,使用桥方法来避免 (详见书8.5.3)

约束

1 不能用类型参数代替基本类型,因为擦除后是 Object
2 泛型类的 getClass 总得到原始 类型,
3 不允许创建参数化类型的数组 new ArrayList[10], 但声明 ArrayList[] 是合法的
可以定义 ArrayList<?>[] 然后进行类型转换为 ArrayList[]
4 不能实例化类型变量, 如 new T(), new T[] 等
5 不能在静态域或方法中引用类型变量

通配符

1 ArrayList 是List, 但是 ArrayList 不是ArrayList
为了解决这个问题, 通过? 来实现通配 如 Pair<? extends T> 就可以 保存 Pair 和 Pair
2 通配符 还能实现 超类型限定
Pair<? super manager> 限定所有 manager 的父类
3 还可以使用无限定的通配符,例如,Pair<? >

反射和泛型

1 Class类是泛型的,如String.Class 就是 Class 类的 一个对象