九、泛型
泛型两大特性:擦除(出现限制)和不协变(出现通配符)
1)限制条件:
1.不能使用基本类型
原因:因为Object类型不能储存如double的值。
2.不能抛出也能不捕获泛型类型实例
原因:Java编译器已限制。
3.参数化类型的数组 如:A<String> a = new A<String>() ;
原因:擦除的时候会将A<String>转化为Object,故把参数丢失了。
4.运行时类型查询只适用于原是类型
原因:因为运行时Java虚拟机中的对象总是一个特定的非泛型类型。如a instanceof A<String>仅仅判断a是否属于A,而不是A<String>。
2)使用方式:
①<?>
②<T>
③<? extends A> 限制了?的上限,即?必须是A或A的子类
④<T extends A> 限制了T的上限,即T必须是A或A的子类
⑤<? super A> 限制了?的下限,即?必须是A或A的父类
⑥<T super A> 限制了T的下限,即T必须是A或A的父类
问题一:为什么出现通配符(?)?
原理:泛型是不协变的(数组是协变的):因为类型参数(T)使用必须是一个类型,当出现List<Integer>与List<Number>相互赋值的时候,使用类型参数(T)将会报错,尽管Integer是Number的子类。因为类型参数已经设 置准确的类型是List<Integer>。当使用通配符的时候,将会解除这个限制 如Collection中的addAll()。
addAll():interface Collection<E>{
public boolean addAll(Collection<? extends E> c) ;
}