1.什么是泛型
JDK5引入泛型,提供了编译时 类型安全 检测机制。该机制允许程序员在编译期检测非法的类型。
本质是参数类型,所操作的数据类型被认定为参数。
只存在于编辑器和编译期,jvm中没有泛型,目的是为了兼容低版本
2.为什么使用泛型
(1)增强编译期错误检测,减少因类型问题引发的运行时异常
(2)具有更强的类型检查,不需要强转
(3)可以使用泛型算法,增加代码复用性
3.Java中的泛型
泛型类、泛型接口、泛型方法
4.常见类型变量名称
E:元素(在Java集合框架中有广泛的应用)
K:键
N:数字
T:类型 V:值
S,U,V 等:第二,第三,第四个类型
5.受限的类型参数
单一限制:<U extends Number>
多种限制:<U extends A & B & C>
extends表达的意义:这里指的是广义上“扩展”,兼有“类继承”和“接口实现”之意 多种限制下的格式
语法要求:如果上限类型是一个类,必须第一位标出,否则编译错误
泛型算法实现的关键:利用受限类型参数
类型推断:根据多个受限参数的交集来推断,取范围最小的,没有交集则用object
6.通配符
泛型中的?为通配符,分为上限通配符?extends Number:只能读不能写
和下限通配符 ? super Integer:只能写不能读
即PECS producer extends consumer super,可以类比生产者和消费者,一个只生产,一个只消费
如果只是?就是不受限通配符,这时,不能调用任何和T相关的方法
通过通配符可以在泛型类和接口直接建立联系,提升了API的灵活性
7.泛型的约束和局限性(类型擦除)
(1)继承泛型类型多态的问题,子类没有覆盖父类的方法(jvm中用桥方法实现)
(2)泛型类型中的方法冲突(如定义 equles(T t)与object类冲突)
(3)没有泛型数组
泛型代码与JVM
(1)虚拟机中没有泛型,只有普通类和代码
(2)编译阶段,所有泛型类的类型参数,都会被object或者限定边界来代替
(3)继承泛型类型时,桥方法是为了避免类型擦除导致的多态问题