Kotlin supply与执行器异步

时间:2019-01-22 04:59:16

标签: kotlin completable-future

我想创建一个具有返回值的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 :(得分:5)

我不确定,为什么它不起作用。但是以下方法确实有效:

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

如您所见,我将第二个参数更改为方法引用。 现在该方法的签名是:

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

如果直接通过执行者,Kotlin将选择签名:

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

您似乎无法混合使用界面和Lambda样式。