您当前的位置: 首页 >  Java

衣舞晨风

暂无认证

  • 3浏览

    0关注

    1156博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Effective Java读书笔记七:泛型(23-29 部分章节需要重读)

衣舞晨风 发布时间:2017-02-06 19:02:02 ,浏览量:3

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

从java1.5发行版本开始,java就提供了一种安全的替代方法,称作无限制的通配符类型,如果要使用范型,但是确定或者不关心实际的参数类型,就可以用一个问号代替。例如范型Set的无限制通配符类型为Set。这是最普通的参数化Set类型,可以持有任何集合。

关于Set的两个事实: 1、因为“?”标记可以代表任何类型,Set可以持有任何类型的元素 2、由于不知道“?”代表的类型,所有我们不能把任何元素放到Set集合中

由于可以将任何元素放进使用原生态类型的集合中,因此很容易破坏该集合的类型约束条件;但不能将任何元素(除了null之外)放到Collection中。

“不要在新代码中使用原生态类型”,这条规则有两个例外,这是因为“泛型信息在运行时就会被擦除”。

在获取类信息中必须使用原生态类型(数组类型和基本类型也算原生态类型),规范不允许使用参数化类型。换句话说:List.class,String[].class和int.class都是合法,但是List.class和List.class都是不合法的。

这条规则的第二个例外与instanceof操作符有关,由于泛型信息在运行时已被擦除,因此在参数化类型而不是无限制通配符类型(如List)上使用instanceof操作符是非法的,用无限制通配符类型代替原生态类型,对instanceof操作的行为不产生任何影响。在这种情况下,尖括号和问号?就显得多余了。

下面是利用泛型来使用instanceof操作符的首先方法:

if(o instanceof set){
       Set m = (Set)o;
       // ...
}

注意,一旦确定这个o是个Set,就必须将它转换成通配类型Set,则不是转换成原生态类型Set,否则Set会引起编译时警告。

总之,使用原生态类型会在运行时导致异常,因此不要在新代码中使用。原生态类型只为了与引入泛型之前的遗留代码进行兼容和互用而提供的。另外Set是个参数化类型,表示可以包括任何对象类型的一个集合;Set则是一个通配符类型,表示只能包含某种未知对象类型的一个集合;Set则是个原生态类型,它脱离了泛型系统。前两者是安全的,最后一种不安全。

术语介绍: 原生态类型:List 参数化的类型:List 泛型:List 有限制类型参数:List 形式类型参数:E 无限制通配符类型:List 有限制通配符类型:List

关注
打赏
1647422595
查看更多评论
立即登录/注册

微信扫码登录

0.0426s