将子类型集合转换为超类型

时间:2018-01-26 14:28:34

标签: java generics

将Java子集合转换为超类型集合的最佳方法是什么?

class A {}
class B extends A {}

final A a = new B(); // OK.

final Collection<B> bs = Arrays.asList(new B());
final Collection<A> as1 = bs; // <- Error
final Collection<A> as2 = (Collection<A>) (Collection<?>) bs; // <- Unchecked cast warning
final Collection<A> as3 = bs.stream().collect(Collectors.toList()); // Browses through all the elements :-/

我必须实现一个返回Collection<A>的方法(在接口中定义),而我得到的具体结果是Collection<B>

2 个答案:

答案 0 :(得分:2)

最简单的方法,假设您不需要通过as1修改集合:

Collection<A> as1 = Collections.unmodifiableCollection(bs);

如果您确实需要修改集合,唯一安全的做法就是复制它:

Collection<A> as1 = new ArrayList<>(bs);

答案 1 :(得分:-1)

其他建议:

public static <A> Collection<A> coerce(final Collection<? extends A> col)
{
    return (Collection<A>) col;
}