首页 > 解决方案 > Kotlin supplyAsync 与 executor

问题描述

我想创建一个 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,但那个版本也有同样的错误。我在这里做错了什么?

在此处输入图像描述

编辑:

我可以通过执行以下操作使其工作,但似乎没有必要。有人可以解释为什么这有效,但其他方法无效。还有其他方法可以编写此代码吗?

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

标签: kotlincompletable-future

解决方案


我不完全知道,为什么它不起作用。但以下确实有效:

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

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

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

如果直接传递 Executor,Kotlin 会选择签名:

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

看起来你不能混合界面和 lambda 风格。


推荐阅读