Котлин поставляет Async с исполнителем - PullRequest
0 голосов
/ 22 января 2019

Я хочу создать CompletableFuture с возвращаемым значением, которое выполняется на конкретном исполнителе в Kotlin.

Следующий код работает просто отлично.

return CompletableFuture.supplyAsync {
        val commandHandler = registry.get<TCommand, TResponse>(command::class.java)
        commandHandler.handle(command)
 }

Однако, когда я пытаюсь передатьисполнитель не скомпилирует.

return CompletableFuture.supplyAsync({
        val commandHandler = registry.get<TCommand, TResponse>(command::class.java)
        commandHandler.handle(command)
}, exec)

Я попытался стать умным, написал версию Java и попросил Intellij скрыть ее в Kotlin, но в этой тоже была та же ошибка.Что я здесь не так делаю?

enter image description here

РЕДАКТИРОВАТЬ:

Я могу заставить его работать, выполнив следующие действия, но это кажется ненужным.Может кто-нибудь объяснить, почему это работает, а другие методы нет.Есть ли другие способы написать этот код?

return CompletableFuture.supplyAsync(Supplier {
    commandHandler.handle(command)
}, exec) 

1 Ответ

0 голосов
/ 22 января 2019

Я точно не знаю, почему это не работает. Но работает следующее:

return CompletableFuture.supplyAsync({
    val commandHandler = registry.get<TCommand, TResponse>(command::class.java)
    commandHandler.handle(command)
}, exec::execute)

Как видите, я изменил второй параметр на ссылку метода. Теперь сигнатура метода:

supplyAsync(supplier: () -> U, executor: (Runnable)-> Unit)

Если вы передадите Исполнителю напрямую, Котлин выберет подпись:

supplyAsync(supplier: Supplier<U>, executor: Executor)

Похоже, вы не можете смешивать интерфейс и лямбда-стиль.

...