effective java 读书笔记---第五章 泛型

来源:互联网 发布:mac 装了office2016卡 编辑:程序博客网 时间:2024/06/10 17:11

23.请不要在新代码中使用原生态类型

24.消除非受检警告
非受检警告范围应该尽可能的小,不要在方法级上增加SuppressWarnings 注解,需要将这个注解添加到对应的局部变量上去,添加这个注解时需要写明注释,解释为何是安全的

25.列表优先于数组
数组是协变的,如果Sub 是Super 的子类型,那么 Sub[]就是 Super 的子类型,因此如下代码在编译期是合法的

Object[] objectArray = new Long[1];objectArray[0] = "123,456";

但在运行期会抛出ArrayStoreException,而列表则不存在这个问题,List< Object>不会是 List< Long>的超类,类似于上面的代码使用 List 时是非法的
数组域列表的第二大区别,数组是具体化的,数组在运行期才会检查它们元素类型约束,而泛型只在编译时强化它们的类型信息,并在运行期丢弃或者擦除它们的元素类型信息(instance of 不能区分不同元素对象信息的两个 LIst).擦除就是使泛型可以与没有使用泛型的代码随意进行复用
数组和泛型不能很好的进行混用,创建泛型,参数化类型或者类型参数的数组是非法的,例如:new List< E>[],new List< String>[] ,和 new E[],这些在编译时都会导致泛型数组创建错误,只能创建 new List[],因为泛型数组不是类型安全的,泛型必须保证类型安全.
因此当可变参方法与泛型集合使用时会出现警告,因为可变参方法被调用时,会创建一个数组来存放参数.
因此应该优先使用 List< E>而不是数组类型 E[],这样可能会损失性能或者简洁性,但是却有更高的安全性与复用性

26.优先考虑泛型
不能直接创建泛型数组,但是可以使用 Object 数组强行转化成泛型数组(E[])new Object[1] 此时必须确保类型安全,也可以直接使用 Object 数组,但是将 Object 数组中的值强行转换成 E(泛型)
E extends XX 限制泛型必须是 XX 的子类型

27.优先考虑泛型方法
泛型方法就像泛型一样,使用起来比要求客户端转换输入参数并返回值得方法来得更加安全,也更加容易.就像类型一样,应该确保新方法不需要转换就能使用,这通常意味着要将它们泛型化.

28.利用有限制的通配符来提升 api 的灵活性
使用 < ? extends E> < ? super E>来提升泛型方法的实用性(可以对子类有效,可以返回父类)

29.优先考虑类型安全的异构容器

0 0
原创粉丝点击