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

       1、泛型与原生态类型

        声明中具有一个或者多个类型参数的类或者接口,就是泛型类或者接口。每个泛型都定义一个原生态类型,即不带任何实际类型参数的泛型名称。例如,List<E>相对应的原生态类型是List。

        2、请不要在新代码中使用原生态类型。虽然不提供类型参数,使用集合类型和其他泛型也仍然是合法的,但是这样就失掉了泛型在安全性(编译时检查)和表述性方面的所有优势

        两个小小的例外,两者都源于“泛型信息可以在运行时被擦除”这一事实。

        1)在类文字中必须使用原生态类型,规范不允许使用参数化类型。List.class,String[].class,int.class都是合法的,但是List<String>.class,List<?>.class则不合法。

        2)第二个例外与instanceof操作符相关。由于泛型信息可以在运行时被擦除,因此在参数化类型而非无限制通配符上使用instanceof操作符是非法的。用无限制通配符类型代替原生态类型,对instanceof操作符的行为不会产生任何影响。在这种情况下,进括号(<>)和问号(?)就显得多余了。下面是利用泛型来使用instanceof操作符的首选方法:

//Legitimate use of raw type –instanceof operator
If(o instanceof Set){                   //Rawtype
         Set<?>m = (Set<?>)o;     //wildcard type
}

        一旦确定这个o是个Set,就必须将它转化成为通配符类型Set<?>,而不是转换成原生态类型Set。这是个受检的转换,因此不会导致编译时警告

        总之,使用原生态类型会在运行时导致异常,因此不要在新代码中使用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值