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>不会做你想要的?
Ste*_*ker 11
你不能这样做.你有一个Collection <SomeClass>并希望返回Collection <SuperClass>
现在想象有人有你的返回集合 - 他们试图插入一个不同的SuperClass子类,SomeOtherClass.这应该在你的SuperClass集合上允许 - 但它不能,因为它实际上是一个Collection <SomeClass>,除了A的私有成员之外的任何人都不知道.
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)
如果需要,您还可以使用其他收集器.
| 归档时间: |
|
| 查看次数: |
13797 次 |
| 最近记录: |