Рассмотрим следующий код:
public static Mono<String> myFunction(boolean condition) {
if (condition) {
// returns Mono<String>
return Mono.fromSupplier(() -> "Hello, World!");
} else {
// returns Mono<Void>
return Mono.fromRunnable(() -> System.out.println("Running a task..."));
}
}
Этот код компилируется и работает отлично. Mono.fromSupplier возвращает String, тогда как Mono.fromRunnable возвращает Mono<Void>, то в идеале компиляция должна завершиться неудачно. Что мне не хватает?




Mono.fromRunnable не обязательно возвращается Mono<Void>. Фактически, он может вернуть Mono<T> для любого T.
public static <T> Mono<T> fromRunnable(Runnable runnable)
Из-за вывода типа предполагается, что вы имеете в виду Mono.<String>fromRunnable(...).
Он создает пустой Mono<String>, который завершается без выдачи какого-либо значения. Подумайте Mono.empty(), за исключением того, что Runnable работает по подписке.
@Коди, да, он ничего не возвращает. Вот почему он создает пустое моно. Какие рассуждения вам нужны?
Класс Mono в Project Reactor — это универсальный тип, а Mono — подтип Mono. Хотя это может показаться противоречивым, это не совсем так. Здесь происходит то, что Mono можно рассматривать как Mono<?>, который представляет собой тип, который может представлять любой тип Mono, включая Mono.
Из-за стирания типа в Java и поскольку Mono не содержит какого-либо конкретного значения (это «пустой» тип), компилятор может обрабатывать его, как если бы это был Mono, когда это необходимо.
окей, я понял. Но какова причина этого? AFAIK
Runnableничего не возвращает.