我将我的项目迁移到 Kotlin,这个阶段 Java 和 Kotlin 之间有很多交互。在下面的示例中,我需要传递一个实现 Java Supply 接口的函数。java.util.concurrent.CompletableFuture.supplyAsync<Int>({ -> 3 }, executor)CompletableFuture.supplyAsync({ 3 }, executor)IntelJ 显示错误:Type mismatch.Required: Supplier<Int!>!Found: () -> Int我找到了一个使用帮助程序类的解决方法,但它不是内联解决方案。class Help : Supplier<Int> { fun get() = 3 }supplyAsync(Help(), executor)
1 回答
PIPIONE
TA贡献1829条经验 获得超9个赞
这将起作用:
CompletableFuture.supplyAsync({ 3 }, executor::execute)
注意这两个签名是
public static <U> supplyAsync(supplier: Supplier<U>, executor: Executor): CompletableFuture<U> public static <U> supplyAsync(supplier: () -> U, executor: (Runnable) -> Unit): CompletableFuture<U>
也就是说,如果您想传入 lambda,执行它的对象必须是方法引用(而不是实例Executor
)。
Kotlin 允许您调用采用 SAM(功能接口)参数并以适当的 Kotlin 函数作为参数的方法。然而,这要么全有,要么全无。您可以为所有 SAM 参数传递一个 Kotlin 函数,也可以不传递一个 Kotlin 函数。这解释了为什么您最初采用的方法无法编译。这不是 Java API 的特定方法,而是适用于 Java 类上定义的所有方法。
添加回答
举报
0/150
提交
取消