Это потому, что Stream.map
имеет следующую подпись:
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
В этом случае R
равно A<? extends B>
.Следовательно, возвращаемое значение функции неявно
? extends A<? extends B>
В этот момент я полагаю на этот вопрос в некоторой степени отвечает
Является ли List подклассом List ?Почему дженерики Java не являются неявно полиморфными?
Это можно сделать для удобной компиляции, либо изменив тип возвращаемого значения:
<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);
}
Для пояснения, Stream<C>
, где C extends A<B>
, само по себе не является Stream<A<? extends B>>
.