泛型

本篇文章主要是总结一下自己在看Effective Java第二版第五章泛型做的笔记。

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

这条建议是告诉我们在写java代码的过程中不要漏写类型参数,而只写原生态类型。原生态类型是不带任何实际类型参数的泛型名称,例如List<E> 的原生态类型是List。如果我们只使用原生态类型,那么我们就失去了安全性和表述性方面的所有优势。安全性是指泛型能够自动帮助我们进行类型的转换,表述性是指泛型代码体现这里只能插入参数化类型。
List和List<Object> 有什么区别呢?我们都可以往里面插入任意类型。List逃避了泛型检查;而List<Object> 则告诉编译器,它能够持有任意类型的对象。泛型是有子类化的规则,则List<String> 是List的子类型,但不是List<Object> 的子类型。即我们不能将List<String> 传递给需要List<Object> 参数的方法。所以在代码中使用List(即原生态类型)会失去安全性。
例外情况:
1. 在取类信息时用原生态类型,如使用List.class而不使用List<String>.class
2. 使用instanceof关键字时,如下代码

if (o instanceof Set) {
    Set<?> m = (Set<?>) set;
}

24:消除非受检警告

要尽可能地消除每一个非受检警告,如果消除了所有警告,就可以保证代码类型是安全的。如果无法消除警告,并且能够保证代码是类型安全的,则可以使用@SuppressWarnings(“unchecked”)注解禁止这条警告。使用了此注解之后可以将禁止该警告的原因在注释中写出。

25:列表优于数组

  1. 数组是协变得,即如果Sub是Super的子类型,则Sub[]是Super[]的子类型。但是泛型不可变,即对于不同的Type1和Type2(Type1,Type2可以有继承关系),List<Type1>不是List<Type2> 的子类型,也不是List<Type2> 的超类型。
  2. 数组在运行时才知道并检查元素的类型约束。泛型是通过擦除实现的,这意味着泛型只在编译时强化类型信息,在运行时就丢弃元素类型信息了。擦除的目的就是为了是泛型代码与没有使用泛型的代码随意进行互用。不能创建泛型数组,如下都是非法的List<E>[],new List<String>[],new E[]

26:优先考虑泛型

编写方法时,优先考虑泛型,代码能够处理多种类型,同时对于以后代码的扩展也有好处

27:优先考虑泛型方法

28:利用有限制通配符来提升API的灵活性

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值