FWIW, аналогичная проблема с ковариантными аргументами все еще существует в Stream.iterate и Stream.iterate в Java 11. Текущие сигнатуры методов
static <T> Stream<T> iterate(T seed, Predicate<? super T> hasNext, UnaryOperator<T> next)
static <T> Stream<T> iterate(T seed, UnaryOperator<T> f)
Эти подписи не допускают некоторые комбинации начальных значений и UnaryOperator
s, которые являются звуковыми с точки зрения типа, например, следующее не компилируется:
UnaryOperator<String> op = s -> s;
Stream<CharSequence> scs = iterate("", op); // error
Предлагаемое решениеэто изменить сигнатуры метода на
static <T, S extends T> Stream<T> iterate(S seed, Predicate<? super S> hasNext, UnaryOperator<S> next)
static <T, S extends T> Stream<T> iterate(S seed, UnaryOperator<S> f)
Так, в отличие от Optional.or и Optional.flatMap , это случай, когда «дополнительный тип-параметрический подход "реально работает.