我想创建一个具有返回值的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)
答案 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样式。