将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>
。
答案 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;
}