Неожиданный тип возвращаемого значения реактивной функции

Рассмотрим следующий код:

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>, то в идеале компиляция должна завершиться неудачно. Что мне не хватает?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Mono.fromRunnable не обязательно возвращается Mono<Void>. Фактически, он может вернуть Mono<T> для любого T.

public static <T> Mono<T> fromRunnable(Runnable runnable)

Из-за вывода типа предполагается, что вы имеете в виду Mono.<String>fromRunnable(...).

Он создает пустой Mono<String>, который завершается без выдачи какого-либо значения. Подумайте Mono.empty(), за исключением того, что Runnable работает по подписке.

окей, я понял. Но какова причина этого? AFAIK Runnable ничего не возвращает.

Cody 12.08.2024 06:46

@Коди, да, он ничего не возвращает. Вот почему он создает пустое моно. Какие рассуждения вам нужны?

Sweeper 12.08.2024 07:32

Класс Mono в Project Reactor — это универсальный тип, а Mono — подтип Mono. Хотя это может показаться противоречивым, это не совсем так. Здесь происходит то, что Mono можно рассматривать как Mono<?>, который представляет собой тип, который может представлять любой тип Mono, включая Mono.

Из-за стирания типа в Java и поскольку Mono не содержит какого-либо конкретного значения (это «пустой» тип), компилятор может обрабатывать его, как если бы это был Mono, когда это необходимо.

Другие вопросы по теме