泛型
什么是泛型
泛型:
- 编译期间检查类型
- 建设了数据类型转换
不采用泛型可能造成ClassCastException
通过强制转换并不能解决。
泛型类
- 泛型类在创建对象的时候,来指定操作的具体操作类型。
- 泛型类在创建对象的时候,没有指定类型,将按照Object类型操作
- 泛型类,不支持基本数据类型
- 同一泛型类,根据不同的数据类型创建的对象,本质上都是同一类型
泛型类派生子类
泛型接口
泛型方法
能够用泛型方法解决的就不要用泛型类!(因为泛型方法更灵活)
类型通配符
TreeSet可以传父类的比较器
类型擦除
无限制类型擦除
有限制类型擦除
按照上限类型 进行类型擦除
擦除方法中的类型定义的参数
桥接方法
泛型与数组
不能创建带数组的泛型对象:
- 编译器在编译的时候会做类型擦除,数组会在整个编译器持有它初始的数据类型
- 在设计上就是冲突的
可以这样创建
可能发生ClassCastException报错
所以最好不要暴露原生数组对象
如此创建数组
泛型类型去创建一个数组引用 对象不采用泛,创建一个原生数组对象去赋给数组引用。
我们不知道T的数据类型,无法new出对象,导致报错。
通过java.lang.reflect.Array的newInstance创建数组
newInstance(Class,int)
建议:尽量不要使用泛型数组,用泛型集合代替
泛型与反射
总结
- 泛型在面对对象编程和设计模式运用比较广泛
- 注意泛型类跟泛型方法的区别
- 类型通配符? 是一个实参
- 泛型只保持在编译器,编译完成将被擦除(大多是Object,又上限则为上限类型)
- 两种方式:
一:创建一个泛型数组的引用然后创建一个非泛型的对象
二:借助Array的newInstance创建