java泛型。
一、不要在新代码中使用原生态类型
如果使用原生态类型,就失掉了泛型在安全性和表述性方面的所有优势。
原生态类型只是为了与引入泛型之前的遗留代码进行兼容和互用而提供的。
Set<Object>是个参数化类型,表示可以包含任何对象类型的一个集合,Set<?>则是一个通配符类型,表示只能包含某种未知对象类型的一个集合;Set则是个原生态类型,它脱离了泛型系统,前两种是安全的,最后一种不安全。
二、消除非受检警告
尽可能地消除每一个非受检警告,如果消除了所有警告,就可以确保代码是类型安全的,这是一件好事情。
如果无法消除警告,同时可以证明引起警告的代码是类型安全的,可以用一个@SuppressWarnings(“unchecked”)注解来禁止这条警告。
非受检警告很重要,不要忽略它们,每一条警告都表示可能在运行时抛出ClassCastException异常。
三、列表优先于数组
数组是具体化的,数组会在运行时才知道并检查它们的元素类型约束。
泛型通过擦除来实现的,泛型在编译时强化它们的类型信息,并在运行时丢弃(或擦除)它们的元素类型信息。
四、优先考虑泛型
泛型的类型参数是没有限制的,可以创建Stack<Object>、Stack<int[]>、Stack<List<String>>但是不能创建基本类型的Stack,企图创建Stack<int>等会产生一个编译时错误,可以使用基本包装类型来避开这条限制。
泛型可以限制可允许的类型参数值。
classDelayQueue<E extends Delayed> implements BlockingQueue<E>
四、优先考虑泛型方法
就如类可以从泛型中受益一样,方法也是,静态工具方法尤其适合于泛型化。Collections中的所有“算法”方法都泛型化了。
五、利用有限制通配符来提升API的灵活性
如果编写的是将被广泛使用的类库,则一定要适当地利用通配符类型
基本原则是:producer-extends,consumer-super(PECS),所有的comparable和comparator都是消费者。