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 读书笔记之四 泛型的更多相关文章
- Effective java读书笔记
2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习.看书,努力提升自己 计在16年要看12本书,主要涉及java基础.Spring研究.java并发.J ...
- Effective Java读书笔记完结啦
Effective Java是一本经典的书, 很实用的Java进阶读物, 提供了各个方面的best practices. 最近终于做完了Effective Java的读书笔记, 发布出来与大家共享. ...
- Effective Java 读书笔记(一):使用静态工厂方法代替构造器
这是Effective Java第2章提出的第一条建议: 考虑用静态工厂方法代替构造器 此处的静态工厂方法并不是设计模式,主要指static修饰的静态方法,关于static的说明可以参考之前的博文&l ...
- Effective Java 读书笔记(四):泛型
1 不要使用原始类型 (1)术语 术语 例子 参数化类型(Parameterized type) List<String> 实际类型参数(Actual type parameter) St ...
- [Effective Java 读书笔记] 第三章类和接口 第二十三-- ??条
第二十三条 请不要再新代码中使用原生态类型 1 使用原生态类型,就失去了泛型在安全性和表述性方面的所有优势,所以新代码中不要使用原生态类型 2 List<String>可以传递给List作 ...
- Effective Java 读书笔记
创建和销毁对象 >考虑用静态工厂方法替代构造器. 优点: ●优势在于有名称. ●不必再每次调用他们的时候都创建一个新的对象. ●可以返回原返回类型的任何子类型的对象. ●在创建参数化类型实例的时 ...
- Effective Java 读书笔记之九 并发
一.访问共享的可变数据时要同步 1.synchronized关键字既然保证访问的可见性也能保证原子性.而volatile修饰符只能保证变量的线程可见性. 2.增量操作符等不是原子性,多线程操作时可能导 ...
- Effective Java 读书笔记之七 通用程序设计
一.将局部变量的作用域最小化 1.在第一次使用变量的地方声明 2.几乎每个变量的声明都应该包含一个初始化表达式:try-catch语句是一个例外 3.使方法小而集中是一个好的策略 二.for-each ...
- Effective Java 读书笔记之一 创建和销毁对象
一.考虑用静态工厂方法代替构造器 这里的静态工厂方法是指类中使用public static 修饰的方法,和设计模式的工厂方法模式没有任何关系.相对于使用共有的构造器来创建对象,静态工厂方法有几大优势: ...
随机推荐
- auto dock
http://mgltools.scripps.edu/ http://mgltools.scripps.edu/downloads/previous-releases/mgltools-1-5.4/ ...
- nginx访问日志获取访问前10的url
在ELK里面获取top10的url在日志量非常大的情况下是非常消耗内存的,所以写了一个脚本用来快速获取. 配置文件 log.conf [log] log_file = /data/logs/nginx ...
- socket编程--socket模块介绍
socket也称作'套接字,用于描述IP地址和端口,是一个通信的终点. socket起源于Unix,而Unix/Linux基本哲学之一就是"一切皆文件",对于文件用[打开][读写] ...
- Python QQ群
微信公众号:Python中文社区 Python初级技术交流QQ群:152745094Python高级技术交流QQ群:273186166Python网络爬虫组QQ群:206241755PythonWeb ...
- Python学习笔记——基本语法
1.程序输出——print语句 >>> myString = 'Hello World!' >>> print myString Hello World! > ...
- SQL 使用小记
1. case语句 示例 select id, name, case user_role then "管理员" then "未注册用户" then " ...
- 有关stdint.h 文件
有关stdint.h 文件 Google C++编程规范的P25页有如下叙述: <stdint.h> 定义了 int16_t . uint32_t . int64_t 等整型,在需要确定大 ...
- 第4章 jQuery的事件和动画(1)——事件篇
jQuery扩展了JavaScript的基本事件处理机制,极大增强了事件处理能力 一. jQuery的事件 1. $(document).ready(function(){})加载方式 再次回到win ...
- Azure媒体服务 直播延迟的原因解析
当我们使用媒体服务的直播功能,会发现有时候会有较大的延迟,而延迟的产生和客户端以及推送软件的配置也有关系,本文以Wirecast为例进行分析 Encoder导致的延迟:在编码这一步骤的时候,它会消耗机 ...
- MyEclipse 中各种 libraries 的含义
MyEclipse 中各种 libraries 的含义 JRE System Library,Java EE 5 Libraries,Referenced Libraries这三个都是各 ...