[guava]ImmutableList使用问题分析

今天用到ImmutableList的时候,在使用ImmutableList的过程中发现针对于
使用场景:
    public ImmutableList validatePredicates = ImmutableList.of(
            new BmZJGroupService()
    );
其中
BmZJGroupService 是 BmAbstractGroupService的子类
此时会报错,报错提示将BmAbstractGroupService转换为BmZJGroupService
但是同样的使用场景
public ImmutableList 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 ImmutableList of(E element) {
    return new SingletonImmutableList(element);
  }

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

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

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



你可能感兴趣的:(java)