码迷,mamicode.com
首页 > 编程语言 > 详细

Effective java经验之谈,泛型

时间:2015-04-15 21:32:56      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:java   设计   泛型   api   arraylist   

对于泛型这一章,在起始写框架的时候,并没有注意细节,造成了很多方法或者类的错误设计。这本书在这点上弥补了我一个短板。大概的总结如下。

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的父类


 

Effective java经验之谈,泛型

标签:java   设计   泛型   api   arraylist   

原文地址:http://blog.csdn.net/supera_li/article/details/45064081

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!