猿问

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

以下类和方法:


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错误吗?


德玛西亚99
浏览 158回答 1
1回答

智慧大石

这是因为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() {&nbsp; &nbsp; return findAll()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Stream<Optional<A<? extends B>>>&nbsp; &nbsp; &nbsp; .map(Optional::get)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Stream<A<capture of ? extends B>>&nbsp; &nbsp; &nbsp; .filter(a -> false);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Stream<A<capture of ? extends B>>}或显式转换函数以返回A<? extends B>:<T extends B> Stream<A<? extends B>> find() {&nbsp; &nbsp; return findAll()&nbsp; &nbsp; &nbsp; .map((Function<Optional<A<? extends B>>, A<? extends B>>) Optional::get)&nbsp; &nbsp; &nbsp; .filter(a -> false);}澄清一下, a Stream<C>, where C extends A<B>,本身不是 a Stream<A<? extends B>>。
随时随地看视频慕课网APP

相关分类

Java
我要回答