首页 > 代码库 > Effective Java 读书笔记之四 泛型
Effective Java 读书笔记之四 泛型
泛型的本质是参数化类型。只对编译器有效。
一、请不要在新代码中使用原生态类型
1、泛型类和接口统称为泛型,有一个对应的原生态类型。
2、原生类型的存在是为了移植兼容性。
3、无限制通配类型和原生态类型的区别是:通配符类型是安全的,原生态类型不安全。你可以将任何元素放入到原生态类型的集合中,但不能将除了null之外的其他任何元素放到Collection<?>中。
4、两条例外:
a、在Class中只能使用原生态类型,因为泛型信息可以在运行时被擦除。
b、在操作instanceof时,使用参数化类型非法。
5、总结:Set<Object>是个参数化类型,可包含任何对象类型的一个集合;Set<?>则是一个通配符类型,只能包含某种未知对象的一个集合;Set是原生态类型。
二、消除非受检警告
1、尽可能地消除每一个非受检的警告。
2、可以使用@SuppressWarnings消除安全的类型警告,因该在尽可能小的范围内使用。增加变量声明是一个不错的技巧。
3、使用@SuppressWarnings注解时,都要添加一条注释,说明为什么这么做是类型安全的。
三、列表优先于数组
数组与泛型相比的两个不同点:
a、数组是协变的:Sub是Super的子类,Sub[] 就是 Super[] 的子类。
b、数组是具体化的:在运行时才知道并检查它们的元素类型约束。
基于以上两点得出:数组和泛型是不能很好地混合使用的。若混合使用时出现了错误或者警告,应该使用列表代替数组。
四、优先考虑泛型
1、使用泛型比使用需要在客户端代码中进行转换的类型来得更加安全,也更加容易。
五、优先考虑泛型方法
1、静态工具方法尤其适合于泛型化。
2、显著特性:无需显著地指定类型参数的值,调用泛型构造器时必须指定。
六、利用有限制通配符来提升API的灵活性
1、通过使用有限制的通配符类型,可以提升API的灵活性。
2、可以参考生产和消费属性来对应地选择extends和super。producer-extends,comsumer-super(PECS)原则。
3、类型参数和通配符之间具有双重性。
七、优先考虑类型安全的异构容器
1、异构容器是通过使用类型令牌作为参数来实现的。
Effective Java 读书笔记之四 泛型