Рассмотрим следующий код:
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
ничего не возвращает.