将Collection <SomeClass>转换为Collection <SomeSuperClass>

skr*_*bel 22 java generics casting

我确信之前已经回答了,但我真的找不到它.

我有一个java类SomeClass和一个抽象类SomeSuperClass.SomeClass延伸SomeSuperClass.

另一个抽象方法有一个返回a的方法Collection<SomeSuperClass>.在一个实现类中,我有一个Collection<SomeClass> myCollection

我明白我不能只返回myCollection,因为Collection<SomeClass>不会继承Collection<SomeSuperClass>.然而,我知道所有内容myCollection都是SomeSuperClass因为它毕竟是SomeClass延伸的对象SomeSuperClass.

我怎样才能做到这一点?

就是我想要的

public class A
{
  private Collection<SomeClass> myCollection;

  public Collection<SomeSuperClass> getCollection()
  {
    return myCollection; //compile error!
  }
}
Run Code Online (Sandbox Code Playgroud)

我发现的唯一方法是通过非泛型类型进行投射并获取未经检查的警告和诸如此类的东西.但是必须有更优雅的方式吗?我觉得Collections.checkedSet()也不需要使用和朋友,因为静态地确定返回的集合只包含SomeClass对象(在向下转换而不是向上转换时不会出现这种情况,但这不是我正在做的事情).我错过了什么?

谢谢!

小智 21

Collection<? extends SomeSuperClass>不会做你想要的?

  • 这是解决这个问题的正确方法.请参阅:http://java.sun.com/docs/books/tutorial/extra/generics/wildcards.html (3认同)

Ste*_*ker 11

你不能这样做.你有一个Collection <SomeClass>并希望返回Collection <SuperClass>

现在想象有人有你的返回集合 - 他们试图插入一个不同的SuperClass子类,SomeOtherClass.这应该在你的SuperClass集合上允许 - 但它不能,因为它实际上是一个Collection <SomeClass>,除了A的私有成员之外的任何人都不知道.

  • Java在[Collections](http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#unmodifiableCollection(java.util.Collection))中支持不可修改的视图.`unmodifiable`方法也采用类型参数,并允许它返回超类类型的集合.`public static <T> Collection <T> unmodifiableCollection(Collection <?extends T> c)` (4认同)

Vla*_*zki 5

Java 8现在提供了一种使用lambdas的更简洁的方法:您可以使用map()和collect()函数将对象强制转换为超类.您的示例的解决方案如下所示:

public class A
{
    private Collection<SomeClass> myCollection;

    public Collection<SomeSuperClass> getCollection()
    {
        return myCollection.stream().map(x -> (SomeSuperClass) x).collect(Collectors.toList());
    }
}
Run Code Online (Sandbox Code Playgroud)

如果需要,您还可以使用其他收集器.