Effective java经验之谈,泛型

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

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

时间: 2024-12-18 03:02:19

Effective java经验之谈,泛型的相关文章

【总结】Effective java经验之谈,类与接口

转载请注明出处:http://blog.csdn.NET/supera_li/article/details/44940563 Effective Java系列 1.Effective java经验之谈,创建和销毁对象 2.Effective java经验之谈,泛型 3.Effective java经验之谈,类与接口 4.Effective java经验之谈,通用方法 5.Effective java经验之谈,枚举,注解,方法,通用设计,异常 6.Effective java经验之谈,并发编程

Effective java经验之谈,创建和销毁对象

关于Effective java 这本书,自己的一些总结性的思考.篇幅可能不按照目录来,因为自己喜欢先看哪一章就直接阅读了.不过能确定的是,每一章都会有总结.欢迎大家拍砖与补充. 1.      考虑用静态工厂的方法代替构造器.优点:有名字,不必每次创建对象,返回任何子类型对象,简洁的代码.缺点:该类将不能被子类化(复合大于继承,也是优点),不方便doc工具输出文档,一般约定的命名规则: valueOf  转换类型 getInstance 获得对象实例 newInstance 创建新的对象实例

Effective Java之泛型

泛型是Java在JDK1.5版本中引入的一个特性,泛型的出现大大增强了Java代码运行时的安全性,泛型主要应用于容器类中,因为这些类会包含各种各样的其他类,所以需要用泛型来对容器中所包含的类进行约束,比如为List传入一个String的类型参数,那么,这个List对象就只能包含有String类型的类,而不能向1.5之前的原始版本一样,可以包含各种不同的类,泛型的引入大大增强了集合类的约束,减少在使用集合类时报类型转换错误的概率. 书里面建议,在使用数组时尽量采用泛型容器,而不是基本的数组类型,里

Effective Java - 关于泛型

自Java 1.5开始使用的泛型,泛型给人比较直观的印象是..."尖括号里写了类型我就不用检查类型也不用强转了". 确实,那先从API的使用者的角度上想问题,泛型还有什么意义? Discover errors as soon as possible after they are made, ideally at compile time. 泛型提供的正是这种能力. 比如有一个只允许加入String的集合,在没有声明类型参数的情况下,这种限制通常通过注视来保证. 接着在集合中add一个I

Effective java经验之谈,枚举,注解,方法,通用设计,异常

这几章看的比较快,内容就如同标题一样比较容易理解,所以只有部分内容会在[]中解释,其他的就直接理解标题,并不影响阅读质量. 不过如果时间充足的话,还是仔细读一读原书的内容,相信还是有所收获的.主要最近自己想进入算法与机器学习部分,尽快结束这本书. 另一方面,讨论一些自己感兴趣的内容,我会将搞过的东西总结下.后面可能写一部分关于java字节码阅读以及编写的东西.只所以这么来, 是因为字节码编程还是非常用途实际的,这一"java编译语言"使得String与StringBuilder的性能对

Effective java -- 4 泛型

第二十三条:请不要在代码中使用原生态类型就是像Set这种待泛型的,就把泛型明确写出来. 第二十四条:消除非受检警告就是Set<String> sets = new HashSet();这种,第二个泛型不加会有一个警告. 第二十五条:列表优先于数组数组和泛型的区别: 数组是协变的.就是如果Sub是Super的子类型,那么Sub[]就是Super[]的子类型.泛型则是不可变的. 数组是可具体化的.一次数组会在运行时才知道并检查他们的元素类型约束. 第二十六条:优先考虑泛型类上加上泛型. 第二十七条

Effective java经验之谈,类与接口

本章描述的是,自己在做系统重构的时候,阅读的章节,给自己在架构方面提供很大帮助.总结出一些干货分享一下啊啊啊~~主要应用场景是编写类与接口的时候需要注意的问题.每一章不一定按照顺序更新.欢迎拍砖补充. 1.类与成员的访问权限最小化.Public staticfinal 如果指向的是对象(数组也是对象),那么往往是错误的写法,[private static final  A=指向该对象,同时采用public static final指向A.clone()(A的副本)][private static

Effective java经验之谈,通用方法

对于通用方法,其实应用的场景是比较多的,我们在写一个类的时候,就要考虑是否要编写该方法的通用方法.这使得我们为以后该类的扩展性与使用方面提供很大的便利. 1.      覆盖equals时请遵守通用约定.自反性,对称性,传递性,一致性,非空性.编写子类equals的方法的时候,可以考虑是否可以用复合,不使用继承来解决问题.Instanceof进行参数检测,如果参数null,也将返回false. 2.      覆盖equals时总要覆盖hashCode. 1.对象属性不变化,返回的hashcod

Effective Java 第三版——29. 优先考虑泛型

Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8,甚至9的发布,Java语言发生了深刻的变化. 在这里第一时间翻译成中文版.供大家学习分享之用. 29. 优先考虑泛型 参数化声明并使用JDK提供的泛型类型和方法通常不会太困难. 但编写自己的泛型类型有点困难,但值得努力学习. 考虑条目 7中的简单堆栈实现: // Ob