代码之家  ›  专栏  ›  技术社区  ›  Emmanuel Guiton

将子类型集合转换为超类型集合[重复]

  •  1
  • Emmanuel Guiton  · 技术社区  · 6 年前

    在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 回复  |  直到 6 年前
        1
  •  2
  •   Andy Turner    6 年前

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

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

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

    Collection<A> as1 = new ArrayList<>(bs);
    
        2
  •  -1
  •   Emmanuel Guiton    6 年前

    其他建议:

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