繁体   English   中英

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

[英]How to pass Kotlin lambda to Java Supplier argument?

我将项目迁移到Kotlin,并且此阶段在Java和Kotlin之间进行了大量交互。

在下面的示例中,我需要传递一个实现Java Supplier接口的函数。

java.util.concurrent.CompletableFuture.supplyAsync<Int>({ -> 3 }, executor)

CompletableFuture.supplyAsync({ 3 }, executor)

IntellJ显示错误:

Type mismatch.
Required: Supplier<Int!>!
Found: () -> Int

我发现了一个帮助器类的解决方法,但这不是嵌入式解决方案。

class Help : Supplier<Int> { fun get() = 3 }
supplyAsync(Help(), executor)

这将起作用:

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函数,或者不传递任何参数。 这就解释了为什么您最初采用的方法没有编译。 这不是Java API的特定方法,而是适用于Java类上定义的所有方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM