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 修饰的方法,和设计模式的工厂方法模式没有任何关系.相对于使用共有的构造器来创建对象,静态工厂方法有几大优势: ...
随机推荐
- SQL Server 2012 安装
SQL Server 2012 安装过程很漫长, 里面很多界面不一一截取了,我分别在win7 企业版 64位 和 win10专业版SP1 64位 装了SQL Server 2012 ,都没有问题. 1 ...
- JAVA Socket超时浅析
JAVA Socket超时浅析 套接字或插座(socket)是一种软件形式的抽象,用于表达两台机器间一个连接的"终端".针对一个特定的连接,每台机器上都有一个"套接字&q ...
- GitHub官方介绍(中文翻译)
注:本人亲自翻译,转载请注明出处. 官方链接地址 http://guides.github.com/activities/hello-world/ Hello World 项目在计算机编程界是一项历史 ...
- win7 中maven安装
1. 下载Maven 下载地址为:http://maven.apache.org/download.html,现在最高的版本为3.0.2,在win7下载文件为:apache-maven-3.0.2-b ...
- JavaBean简单示例
本示例说明: 从Login.jsp中输入用户名和密码,提交,在NewFile.jsp中显示信息. ----- 类要放在一个包中!!! UserB 类文件 package model; public c ...
- 北斗/GPS
北斗/GPS都是用的nmea通用协议. NMEA-0183协议定义的语句非常多,但是常用的或者说兼容性最广的语句只有$GPGGA.$GPGSA.$GPGSV.$GPRMC.$GPVTG.$GPGLL等 ...
- IIS7/IIS7.5中目录执行权限的设置方法
我们在建站的时候,通常有些目录必须给写入权限,这个时候这些目录就很可能被人写入脚本文件,为了将安全性维护得更好,我们可以关闭这些有写入权限的目录的脚本执行权限.IIS6的时候,我们很容易找到关闭的地方 ...
- 【phpcms-v9】phpcms-v9二次开发所必须知道的步骤(转载)
一.做phpcms-v9二次开发时,我们经常需要用到如下代码,所以有必须在这里注释说明一下 defined('IN_PHPCMS') or exit('No permission resources. ...
- knockout-validation不自动插入错误消息
<div data-bind="validationOptions:{insertMessages:false}"> <div class="valid ...
- C# 获取指定接口的所有实现类
var types = AppDomain.CurrentDomain.GetAssemblies() .SelectMany(a => a.GetTypes().Where(t => t ...