泛型的本质是参数化类型。只对编译器有效。

一、请不要在新代码中使用原生态类型

  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 读书笔记之四 泛型的更多相关文章

  1. Effective java读书笔记

    2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习.看书,努力提升自己 计在16年要看12本书,主要涉及java基础.Spring研究.java并发.J ...

  2. Effective Java读书笔记完结啦

    Effective Java是一本经典的书, 很实用的Java进阶读物, 提供了各个方面的best practices. 最近终于做完了Effective Java的读书笔记, 发布出来与大家共享. ...

  3. Effective Java 读书笔记(一):使用静态工厂方法代替构造器

    这是Effective Java第2章提出的第一条建议: 考虑用静态工厂方法代替构造器 此处的静态工厂方法并不是设计模式,主要指static修饰的静态方法,关于static的说明可以参考之前的博文&l ...

  4. Effective Java 读书笔记(四):泛型

    1 不要使用原始类型 (1)术语 术语 例子 参数化类型(Parameterized type) List<String> 实际类型参数(Actual type parameter) St ...

  5. [Effective Java 读书笔记] 第三章类和接口 第二十三-- ??条

    第二十三条 请不要再新代码中使用原生态类型 1 使用原生态类型,就失去了泛型在安全性和表述性方面的所有优势,所以新代码中不要使用原生态类型 2 List<String>可以传递给List作 ...

  6. Effective Java 读书笔记

    创建和销毁对象 >考虑用静态工厂方法替代构造器. 优点: ●优势在于有名称. ●不必再每次调用他们的时候都创建一个新的对象. ●可以返回原返回类型的任何子类型的对象. ●在创建参数化类型实例的时 ...

  7. Effective Java 读书笔记之九 并发

    一.访问共享的可变数据时要同步 1.synchronized关键字既然保证访问的可见性也能保证原子性.而volatile修饰符只能保证变量的线程可见性. 2.增量操作符等不是原子性,多线程操作时可能导 ...

  8. Effective Java 读书笔记之七 通用程序设计

    一.将局部变量的作用域最小化 1.在第一次使用变量的地方声明 2.几乎每个变量的声明都应该包含一个初始化表达式:try-catch语句是一个例外 3.使方法小而集中是一个好的策略 二.for-each ...

  9. Effective Java 读书笔记之一 创建和销毁对象

    一.考虑用静态工厂方法代替构造器 这里的静态工厂方法是指类中使用public static 修饰的方法,和设计模式的工厂方法模式没有任何关系.相对于使用共有的构造器来创建对象,静态工厂方法有几大优势: ...

随机推荐

  1. IPsec 学习笔记

    工作中需要,参考网上的资料对IPSecVPN进行学习,并通过博客记录下一些知识点作为学习记录和后续复习的材料. Transport Layer (TLS) 其中主要参考了以下文档: http://ww ...

  2. java编程思想-接口总结

    "确定接口是理想选择,因而应该总是选择接口而不是具体的类."这其实是一种诱饵.当然,对于创建类,几乎在任何时刻,都可以替代为创建一个接口和一个工厂. 许多人都掉进了这种诱惑的陷阱, ...

  3. CentOS只允许部分IP登陆ssh |ssh 允许指定IP

    在/etc/hosts.allow输入   (其中192.168.10.88是你要允许登陆ssh的ip,或者是一个网段192.168.10.0/24)   sshd:192.168.10.88:all ...

  4. Linux下的网络环境配置

  5. border设置不占用宽度

    经常我们设置好了DIV或其他标签的宽度,但是一加边框,宽度就又增加了,尤其是用百分比的时候,宽度控制不好真是麻烦! 如下有一解决办法,代码如下,(新属性,兼容性不好,手机端.谷歌.火狐测试可以) -w ...

  6. Spring中加载xml配置文件的六种方式

    Spring中加载xml配置文件的六种方式 博客分类: Spring&EJB XMLSpringWebBeanBlog  因为目前正在从事一个项目,项目中一个需求就是所有的功能都是插件的形式装 ...

  7. 网络广告术语CPC、CPM和CTR的含义和关系

    1.       CPC(Cost-per-click):对于广告主来说,就是每次点击(广告)的(付给网站主的)成本:对于媒体(或网站主)来说,就是用户每次点击(广告)(向广告主收取)的费用.可以用公 ...

  8. MongoDB设置访问权限、设置用户(转)

    MongoDB已经使用很长一段时间了,基于MongoDB的数据存储也一直没有使用到权限访问(MongoDB默认设置为无权限访问限制),今天特地花了一点时间研究了一下,研究成果如下: 注:研究成果基于W ...

  9. [Js/Jquery]Jquery tagsinput在h5邮件客户端中应用

    摘要 最近一直在折腾邮件的h5应用,为了保证在pc,ios,android端都可以使用,所以使用H5页面的方式嵌入app的webview中. 页面 UI大概是这样的 Jquery tagsinput下 ...

  10. 管理员必备的Linux系统监控工具

    管理员必备的Linux系统监控工具 #1: top - 进程活动 top提供一个当前运行系统实时动态的视图, 也就是正在运行进程.在默认情况下,显示系统 中CPU使用率最高的任务,并每5秒钟刷新一次. ...