对于泛型这一章,在起始写框架的时候,并没有注意细节,造成了很多方法或者类的错误设计。这本书在这点上弥补了我一个短板。大概的总结如下。
1. 请不要在新代码中使用原生态类型。其实也就是说List不带任何东西的原生态类型。原生态类型的出现是为了解决移植兼容性的。如果想编写出安全的代码,那么就使用泛型。这样可以在编译的时候,指出你是否使用正确。否则原生态类型将在运行期出现类无法转化的异常。
2. 消除非受检警告。格式良好安全的代码应当没有警告,或者让警告最小。如果能够确定非受检警告,可以在其前面注解@SuppressWarnings(“unchecked”)来解除警告。并要在旁边写上注释为什么会注解警告。方便他人阅读代码。
3. 列表优先于数组。数组和泛型有这非常不同的类型规则,数组是协同的,泛型是不可变的且可以被擦除的。因此,数组提供了运行时的类型安全,但是没有编译的类型安全。一般来说,2者之间不能很好的混合使用,最好是利用列表来代替数组。
4. 优先考虑泛型。一般将类泛型化需要2步,声明泛型,将所有object更改为泛型参数E。最后要保证转换的时候是安全的,解除警告。
5. 优先考虑泛型方法。这样新用户就不用转化类型就可以直接使用了。更加的安全,便捷。
6. 利用有限制通配符来提升API的灵活性。E代表类型参数,?代表有限制的通配符。遵守PECS原则,即producer-extends,consumer-super。传入的参数对于该类是添加(生产者),就用extends。如果是减少(消费者),就用super。
如何将有限制通配符?应用到类型参数E中。
Eg:public static <T extendsComparable <? Super T> > T max(List<?Extends T> list)
所有的comparable,comparator都是消费者。所以<T extends Comparable <? Super T> >要优于 <T extends comparable <T>>。
如何将?参数直接在方法中写入到object中。
提供helper辅助类,将?传入到泛型方法中。而这个泛型方法中处理写入object中。这样就会消除编译出的问题。
补充下:
泛型编程-通配符
1) 泛型边界 <Textends A & B & C>语法来声明,其中只能有一个是类,并且只能是extends后面的第一个为类,其他的均只能为接口(和类/接口中的extends意义不同)。
2) 通配符?:?类似于Object,List<? extends Fruit> flist = new ArrayList<Apple>(); 根据具体情况实例化Fruit子类
3) 泛型上边界:<Textends A> 必须是A的子类
4) 泛型下边界: <? super T> 必须是T的父类
原文地址:http://blog.csdn.net/supera_li/article/details/45064081