罗列一些编写泛型时的建议或优化点

下面记录了一些关于编写泛型时的经典条目:
  • 使用原生态类型有可能会在运行时导致异常,因此不要使用。原生态类型只是为了与引入泛型之前的遗留代码进行兼容和互用而提供的。
  • 非受检警告很重要,不要忽略它们。每一条警告都表示可能在运行时抛出 ClassCastException 异常。 要尽最大的努力消除这些警告。如果无法消除非受检警告, 同时可以证明引起警告的代码是类型安全的就可以在尽可能小的范围内使用@Suppress Warnings( “unchecked”)注解禁止该警告。 要用注释把禁止该警告的原因记录下来。
  • 泛型不支持数组,但是数组却在某些情况下可以支持类似泛型的功能,比如Object[],你可以往里面放不同的具体类型值,这种写法在编译时期可以通过,但是运行时期可能就很容易发生ClassCastException异常了(因为从Object[]中提取元素后需要强转),所以应该尽可能使用列表加泛型的形式来实现,而不是选择数组的这种写法,比如使用List<T>代替Object[]。
  • PECS原则:如果参数化类型表示一个生成者(只能对外生成信息),就使用<? extends T>;如果表示一个消费者(只能消费外部给进的信息),就是用<? super T>。什么意思呢?
    首先要知道,List<?>不能读写,只能赋值
    。下面假如类A是类B的子类。
    List<? extends B>可以读取类型为B类型的数据。因为你在赋值的时候编译器会限制你一定是只能赋值B或B子类型的数据对象,所以去读取的时候是安全的,插入数据是不安全的,编译器不能知道你会插入什么子类型,也就是说这种列表只能读取,不能插入,为生成者;
    List<? super A>可以写入类型为A或者为A子类型的数据。因为具体赋值的时候,编译器只能知道具体类型是A的超类,但具体是什么超类并不知道,所以不允许读取,但是这种写法允许写入类型为A或者A子类型的数据,因为最低的类型就是A了,也就是可以假设是List<A>,那么本来就是可以往里面加A或者A的子类型数据的,所以这种列表只能写入,不能读取,为消耗者。
    所以PECS原则就是,如果你想从一个数据类型里获取数据,使用 ? extends 通配符,如果你想把对象写入一个数据结构里,使用 ? super 通配符。
  • 编写泛型可变参数方法时,要确保在方法内没有使用可变参数数组保存它的值,比如:xxx(List<T>… lists)方法,不能使用类似Object[]的可变参数数组去保存它的值,因为处理不慎就容易发生类型转化出错,比如把Object[]作为返回值,使用String[]来接收。可以使用List<T>来接收。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值