猿问

如何将 Kotlin lambda 传递给 Java Supply 参数?

我将我的项目迁移到 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)


长风秋雁
浏览 100回答 1
1回答

PIPIONE

这将起作用: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 类上定义的所有方法。
随时随地看视频慕课网APP

相关分类

Java
我要回答