lambda - 如何在需要接口的地方直接传递 lambda
问题描述
在 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
为什么以及如何解决它?
解决方案
Kotlin仅支持与 Java 互操作的SAM 转换。因此,要么在 Java 类中声明你的便捷方法,要么为你的 Kotlin 函数声明一个函数类型,委托给 Java 调用。
推荐阅读
- r - 如果发现连续缺失的日期,则删除所有先前的行
- ruby-on-rails - 快速连续发送时类似的请求失败
- python - Python Winpdb 问题:无法打开文件'session_manager\..\rpdb2.py':[Errno 2] 没有这样的文件或目录
- python - Python,如何更改另一个类实例的方法
- currency - Odoo 货币转换
- c# - 我的 C# 代码显示文件,但它必须显示目录
- gitlab - GitLab 管道 - 基于 Approval 的代码提交、单元测试和合并
- c# - 在 C# 中将 datagridview 中的日期字符串格式化为 dd/MM/yyyy
- r - 汇总从“S”到下一个的列值
- laravel - (livewire-datatables)无法访问我与同一模型的两个关系