【问题】:编写阶段,定义类时,无法确定类或方法的属性类型
【解决】:
- 使属性类型定义为<泛型列表>,大大了提升了灵活度
- 减少了Object类的强制转换的性能消耗
- 将运行阶段的问题在编译阶段就进行解决
适用场景
类 / 集合类 | 成员属性类型 | 方法形参属性类型 | 返回值属性类型 |
---|
使用须知
- 泛型不支持基本类型
- 不确定类型时,泛型擦除默认
Object类型
,无需强制转换 - 不同类型创建的泛型类实例,运行阶段为同一份泛型类
原因:通过反射getClass()函数查看其运行时类型,为同一份泛型类
//泛型类
public class Mian<T,E>{
private T type;
public E method(E t){
}
}
//泛型方法
public class Mian<T>{
private T type;
//泛型列表的方法
public <E> E method(E e){
}
}
- 调用泛型类或泛型方法的时候,定义泛型实际类型,灵活性高。
- 若调用时,没有手动进行定义泛型实际类型,JVM系统进行类型擦除,泛型标识不会进入运行期间,类型擦除默认Object,有限制默认为上限类型或下限类型。
泛型类接口与泛型方法
泛型类 泛型接口:作用域操控全局的泛型符号
- 子类继承父类,泛型标识保留
理据:因为创建子类时,触发父类的加载,若不一致则造成父类泛型无法确定 - 子类继承父类,保留泛型标识,可扩展泛型标识
- 子类继承父类,但子类是普通类,需对父类泛型标识进行确定
- 重写方法时与父类方法泛型标识一致
泛型方法:可以重新定义泛型标识内容,可独立覆盖泛型类的泛型符号
- 泛型方法不能为直接静态,否则调用时无泛型标识类型确定
- 泛型方法返回值与形参必须都泛型标识
泛型常用符号
常规泛型标识(形参)
- <T> Type类的属性类型
- <E> Element元素属性类型
- <K> Key键
- <V> Value值
举例:Class Construcor
可变泛型标识
- <E…e> 可以传入多个类型
多态泛型标识(多态实参)
泛型通配符< ? >
- <?> 上下无限制,与泛型功能一致,无意义
- <? extends 上线类型> 上限制约束,只能等于或更小
举例:List ArrayList - <? super 下限类型> 下限制约束,只能等于或大于
举例:TreeSet
泛型抹除
泛型符号在存在编译阶段,进入加载阶段JVM对泛型类型抹除替换为你所调用时传入的类型,默认无限制则为Objcet,默认上下限则为上下限制类型。
注意:即使确定了泛型类型,但在运行阶段为同一种属性类型
理据:反射继续运行类型对比
桥接方法
实现接口的类将会生成桥接方法
理据:使用反射,打印所有方法
自定义泛型数组
1. 泛型数组引用,但不能直接创建泛型数组对象
arraryList<Type>[] array = new arrayList[];
2.使用反射java.lang.reflection.array定义一个泛型array工具类
成员变量
private T[] array;
构造方法
array = (T[])Array.newInstance(clz,length);
Putting方法
array[index]=item;
Getting方法
return array;