Ваш тип аргумента для fromStream
неверен в первом примере. Во втором фрагменте он был правильно выведен как Supplier<Stream<? extends Long>>
, тогда как в первом вы явно «сузили» его до чего-то, что не принимается Flux.streamOf
.
Вы можете исправить первый фрагмент, написав:
Supplier<Stream<? extends Long>> longStreamSupplier = ()
-> LongStream.iterate(0,
nextLong -> nextLong + 1).boxed();
Flux<Long> stream = Flux.fromStream(longStreamSupplier);
Вы можете спросить себя
Почему нет перегрузки для этой функции, которая явно принимает Supplier<Stream<T>>
вместо Supplier<Stream<? extends T>>
.
Это из-за Java Стирание типа, рассмотрим следующие две функции:
private void foo(Supplier<Stream<? extends Long>> stream) {
}
private void foo(Supplier<Stream<Long>> stream) {
}
При компиляции, после стирания типа, у нас остается:
private void foo(Supplier stream) {
}
private void foo(Supplier stream) {
}
Что приводит к ошибке компиляции, потому что у нас есть две функции с одинаковыми определениями. Так что в случае Flux::fromStream
реализована более гибкая версия.