如何在需要接口的地方直接传递lambda
Lwjgl中有一个函数,例如:如何在需要接口的地方直接传递lambda,lambda,kotlin,Lambda,Kotlin,Lwjgl中有一个函数,例如: public static void glDebugMessageCallback( @Nullable @NativeType("GLDEBUGPROC") GLDebugMessageCallbackI callback, @NativeType("void const *") long userParam) { nglDebugMessageCallback(memAddressSafe(callback), userParam); } 在Kot
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
为什么以及如何解决这个问题?Kotlin只支持与Java的互操作。因此,要么在Java类中声明便利方法,要么为Kotlin函数声明函数类型,委托给Java调用。Kotlin仅支持与Java的互操作。因此,要么在Java类中声明便利方法,要么为Kotlin函数声明函数类型,委托Java调用。仅为Marko Topolnik的答案添加更多信息,Kotlin接口的SAM转换有可能在1.3版中作为实验性功能得到支持。可能的语法如下所示:
sam interface Callback {
fun justSingleMethod(first: Int, second: Int): Boolean
}
使用方法与Java接口相同:
fun doSomethingWithCallback(callback: Callback) {
...
}
doSomethingWithCallback { first, second -> true }
p.S.信息摘自Stanislav Erokhin(俄语)的以下演示只是为了给Marko Topolnik的答案添加更多信息,Kotlin接口的SAM转换有可能在1.3版中作为实验功能得到支持。可能的语法如下所示:
sam interface Callback {
fun justSingleMethod(first: Int, second: Int): Boolean
}
使用方法与Java接口相同:
fun doSomethingWithCallback(callback: Callback) {
...
}
doSomethingWithCallback { first, second -> true }
附注信息取自Stanislav Erokhin(俄语)的以下演示文稿,希望他们不会为此保留另一个关键字:)每个演示文稿,
sam
不会是新的关键字。它将是“安全关键字”(与数据
相同),您仍然可以声明名为sam
的变量。希望他们不会仅为此保留另一个关键字:)每个演示,sam
不会是新的关键字。它将是“安全关键字”(与数据
相同),并且您仍然能够声明名为sam
的变量。