为了账号安全,请及时绑定邮箱和手机立即绑定

泛型类型上的流操作链导致类型错误

泛型类型上的流操作链导致类型错误

德玛西亚99 2021-12-01 14:30:48
以下类和方法:class A<T extends B> { }class B {}Stream<A<? extends B>> find() {    return findAll()                        // Stream<Optional<A<? extends B>>>            .filter(Optional::isPresent)    // Stream<Optional<A<? extends B>>>            .map(Optional::get)             // Stream<A<capture of ? extends B>>            .filter(a -> false);            // Stream<A<capture of ? extends B>>}Stream<Optional<A<? extends B>>> findAll() {    return Stream.empty();}用javac编译没问题,但是在IDEA中导致类型错误:当我要么删除filter(Optional::isPresent()).map(Optional::get)对去除终极filter召唤我无法理解这一点。这是IDEA错误吗?
查看完整描述

1 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

这是因为Stream.map具有以下签名:


<R> Stream<R> map(Function<? super T, ? extends R> mapper);

在这种情况下,R是A<? extends B>。因此,函数的返回值是隐式的


? extends A<? extends B>

这可以通过更改返回类型来很好地编译:


<T extends B> Stream<? extends A<? extends B>> find() {

    return findAll()                        // Stream<Optional<A<? extends B>>>

      .map(Optional::get)             // Stream<A<capture of ? extends B>>

      .filter(a -> false);            // Stream<A<capture of ? extends B>>

}

或显式转换函数以返回A<? extends B>:


<T extends B> Stream<A<? extends B>> find() {

    return findAll()

      .map((Function<Optional<A<? extends B>>, A<? extends B>>) Optional::get)

      .filter(a -> false);

}

澄清一下, a Stream<C>, where C extends A<B>,本身不是 a Stream<A<? extends B>>。


查看完整回答
反对 回复 2021-12-01
  • 1 回答
  • 0 关注
  • 152 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信