1:什么是泛型?
Java泛型(generics)是JDK5中引入的一个新特性,泛型提供了
编译时类型安全检测机制,
该机制允许程序员在编译时检测到非法的类型
泛型的本质是参数类型,也就是说所操作的数据类型被指定为一个参数
泛型不存在于JVM虚拟机
2:为什么要使用泛型?
泛型可以增强编译时错误检测,减少因类型问题引发的运行时异常
型具有更强的类型检查
泛型可以避免类型转换
泛型可以泛型算法,增加代码复用性
3:java 类中三种泛型
泛型是三大类:1:类泛型class Person<T> 2:接口泛型 Inteface Person<T> 3:方法泛型 public static <T> void getPerson()
4:通配符
泛型中的问号符“?”名为“通配符”
通配符的类型:1:上限通配符 <? extends XXX> 它是老子,可以传参它的儿子
2:下限统配符 <? super XXX> 它是孙子,可以传参它的父亲类
3:非限制通配符 <?>
5:java 泛型遵循:PECS 原则
如果你只需要从集合中获得类型T , 使用<? extends T>通配符
如果你只需要将类型T放到集合中, 使用<? super T>通配符
如果你既要获取又要放置元素,则不使用任何通配符
PECS即 Producer extends Consumer super,好处:提升了API的灵活性
6:泛型里面的擦除
6.1 什么是擦除?产生的原因是啥?
泛型的引入是为了api的扩展,但是由于是jdk1.5之后的事情,所以这个类型编译擦除也是一个伪擦除。主要是jvm字节码没有对应增加。
6.2 :泛型擦除的原则:
编译器会把泛型类型中所有的类型参数替换为它们的上(下)限,如果没有对类型参数做出限制,那么就替换为Object类型。 编译出的字节码仅仅包含了常规类,接口和方法。都保留在类的常量池里面。class.forname("")
消除方法:同对泛型类的处理
无限制:替换为Object
有限制:替换为第一受限类型
6.3:泛型擦除后的一些后遗症:
6.3.1:不可具体化类型:无法整个运行时可知其类型信息的类型,其类型信息已在编译时被擦除: 例如:List<String>和List<Number>,JVM无法在运行时分辨这两者。
6.3.2:无法利用原始类型来创建泛型 ,解决方法:使用它们的包装类。
6.3.3:无法创建类型参数的实例 变通方案:利用反射就是可以
6.3.4:无法创建参数化类型的静态变量,但是可以创建静态方法 原因:静态变量是类所有,共享决定了其必须能确定。但多个类型作为参数传入此类的多个实例时,就会无法确定究竟赋予此静态变量哪个实例对象所传入的参数了,无法对参数化类型使用转换或者instanceof关键字。
6.3.5:无法创建参数化类型的数组,协变和擦除断开了关系。
<T> 泛型
说出一下类型的区别
Plate
Plate<Object>
Plate<?>
Plate<T>
Plate<? extends T>
Plate<? super T>