如何直接传递一个预期接口的lambda

时间:2018-05-24 09:44:28

标签: lambda kotlin

在Lwjgl中有一个函数,例如:

public static void glDebugMessageCallback(
@Nullable @NativeType("GLDEBUGPROC") GLDebugMessageCallbackI callback, 
@NativeType("void const *") long userParam) {
    nglDebugMessageCallback(memAddressSafe(callback), userParam);
}

在Kotlin我可以通过以下方式直接调用它:

glDebugMessageCallback({ _, _, _, _, _, message, _ -> Unit }, NULL)

现在,我想覆盖此调用,省略最后一个参数。

但如果我输入:

fun glDebugMessageCallback(callback: GLDebugMessageCallbackI) {

}

然后是没有NULL的同一个电话:

glDebugMessageCallback({ _, _, _, _, _, message, _ -> Unit })

会出现类型不匹配:

Required: GLDebugMessageCallbackI

Found: (???, ???, ???, ???, ???, ???, ???) → Unit

为什么以及如何解决?

2 个答案:

答案 0 :(得分:2)

Kotlin仅支持SAM conversion与Java互操作。因此要么在Java类中声明你的方便方法,要么为你的Kotlin函数声明一个函数类型,委托给Java调用。

答案 1 :(得分:1)

为了向Marko Topolnik的答案添加更多信息,有可能在1.3版本中支持Kotlin接口的SAM转换作为实验性功能。可能的语法如下所示:

sam interface Callback {
    fun justSingleMethod(first: Int, second: Int): Boolean
}

使用方法与Java接口相同:

fun doSomethingWithCallback(callback: Callback) {
    ...
}

doSomethingWithCallback { first, second -> true }

P.S。信息取自Stanislav Erokhin(俄语)https://youtu.be/gwk4rdgr36E?t=56m54s

的以下介绍