今天用到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。