我想创建一个 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)
最佳答案
我不完全知道,为什么它不起作用。但以下确实有效:
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 风格。
关于Kotlin supplyAsync with executor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54301518/