[guava]ImmutableList使用问题分析

今天用到ImmutableList的时候,在使用ImmutableList的过程中发现针对于
使用场景:
    public ImmutableList<BmAbstractGroupService> validatePredicates = ImmutableList.of(
            new BmZJGroupService()
    );
其中
BmZJGroupService 是 BmAbstractGroupService的子类
此时会报错,报错提示将BmAbstractGroupService转换为BmZJGroupService
但是同样的使用场景
public ImmutableList<ValidatePredicate> validatePredicates = ImmutableList.of(
            new CommonValidatePredicate(),
            new ZJFullTimeRiderValidatePredicate(),
            new ZJPartTimeRiderValidatePredicate(),
            new CityProxyPartTimeRiderValidatePredicate(),
            new ZJFullTimeZDValidatePredicate(),
            new ZJPartTimeZDValidatePredicate()
    );
new CommonValidatePredicate(),new ZJFullTimeRiderValidatePredicate(),new ZJPartTimeRiderValidatePredicate(),
new CityProxyPartTimeRiderValidatePredicate(),
new ZJFullTimeZDValidatePredicate(),new ZJPartTimeZDValidatePredicate()
都继承自ValidatePredicate,但是该场景下没有问题
并不会报错,追踪源码如下:
1.第一种情况
  public static <E> ImmutableList<E> of(E element) {
    return new SingletonImmutableList<E>(element);
  }

2.第二种情况
  /**
   * Returns an immutable list containing the given elements, in order.
   *
   * @throws NullPointerException if any element is null
   */
  public static <E> ImmutableList<E> of(E e1, E e2, E e3, E e4, E e5, E e6) {
    return construct(e1, e2, e3, e4, e5, e6);
  }

分析原因是因为针对第一种情况是因为在返回ImmutableList<E>时将BmZJGroupService转为了 E,ImmutableList<BmZJGroupService>返回给了
ImmutableList<BmAbstractGroupService> validatePredicates
但是此时发ImmutableList<BmAbstractGroupService> !=ImmutableList<BmZJGroupService>,因此会报错
但是对于第二种情况这五个实例具有共同的父类ValidatePredicate,在进行构造时,选取这几个实例的共同的父类作为返回值。

考虑第三种情况,一个BmAbstractGroupService类,一个String类,提示中,显示将Object的类型作为返回值。间接证明了上述是正确的,因为java中所有类的统一父类事Object。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值