假设我有:
interface SomeInterface {
Foo getFoo();
}
和
class SomeClass implements SomeInterface {
Foo getFoo() {
//returns a Foo object
}
}
在一次服务中,我有:
List<SomeClass> getItems() {
//returns a list of SomeClass objects
}
不允许执行以下操作:
Stream<SomeInterface> items = service.getItems().stream();
但最终,我还有其他类可以共享这个接口,并希望执行以下操作:
someMethod(Stream<SomeInterface> items) {
//some operation
}
有办法吗?喜欢用 flatMap
? (我注意到如果我在 List
的 SomeClass
物体,我可以 flatMap
返回流的 Package 器 SomeInterface
对象。)
我没有发现类似的问题,也不容易找到解决办法。可能是我错过的容易的东西。 java 14。
5条答案
按热度按时间55ooxyrt1#
如果无法更改getitems()的方法签名,则可以Map流:
0md85ypi2#
为什么不直接做这个
getItems()
返回列表List<SomeInterface>
```public List getItems()
Stream items = service.getItems().stream();
Stream<? extends SomeInterface> stream = service.getItems().stream();
xmq68pz93#
在不做任何更改的情况下,您可以只使用java通配符和泛型。
Stream<? extends SomeInterface> items = service.getItems().stream();
这个?
意思是“任何扩展接口的东西,不管是什么SomeInterface
“这样对你的孩子会有用的SomeClass
(以及扩展该接口的任何其他类)更多信息:https://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html
示例代码:
gkn4icbw4#
一个选项是显式Map具有强制转换的流:
4ngedf3f5#
如果你的目标是让
someMethod
接受数据流SomeInterface
接口及其子类型,然后您可以使用