因这一缺陷存在, 从而也说明了设计泛型时, 对集合不采用协变, 这样使得错误在编译时期能够捕捉到, 不是延后到运行的时候.
2, 失去集合是协变这一特性, 会使得代码失去灵活性, 如何解决? 用通配符来弥补这一特性.
extends 表示子类统配 ; ? super 表示父类统配
3, 类型限界与通配符的区别:
类型界限用于对方法的限制 AnyType extends (AnyType 可以是随意的字母). 通配符如第二条描述, 用于集合 ? extends
类型界限的表示 > (Comparable 是相应的类)
通配符的表示 Collection 代码形态如下:
含通配符的方法 -- public static double totalArray(Collection) { }
类型界限的方法 -- public static > AnyType findMax(AnyType[] arr ){ }
4, 上诉的 > 类型界限是否完全 ?
从继承的角度来看, 这仍是不完全的: 假设 Shape 实现 Comparable ,
若 Square 继承 Shape , 此时, 根据继承有 Square 实现了 Comparable ,
则 Square IS-A Comparable , 但 Square IS-NOT-A Comparable ,
则是不可思议的 . 解决办法, 从统配符着手, 完美的写法应该是:
> (幸运的是: 这是关于泛型最复杂的用法了)
5, 泛型的限制
泛型主要是为了在编译器能够检查出错误, 而对虚拟机没有影响, 这样可以完全与以前不使用泛型的代码兼容,
在虚拟机运行的时候就会进行类型擦除, 于是下列每一条就是泛型的限制:
i) 基本类型不能用做类型参数, 必须使用包装类
ii)instanceof 检测和类型转换工作只对原始类型进行, 当没有泛型处理 .
iii)static 方法和 static 域 均不可引用类的类型变量
iV) 不能创建一个泛型类型的实例. 如 T obj = new T(); // 右边是非法的
V) 不能创建泛型的数组 . 如 T[] arr = new T[10] ; // 右边是非法的
来源: http://blog.csdn.net/wooloong/article/details/79218322