为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

长风秋雁 2023-07-19 17:01:55
我将我的项目迁移到 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 类上定义的所有方法。


查看完整回答
反对 回复 2023-07-19
  • 1 回答
  • 0 关注
  • 99 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信