java - 如何在多平台项目中使用 Kotlin 正确处理 SAM 功能?
问题描述
我正在开发一个多平台项目,并且正在尝试公开一个 API 来添加侦听器:
interface InputEmitter {
fun addInputListener(listener: InputListener)
}
InputListener
是一个 SAM 接口,它看起来像这样:
interface InputListener {
fun onInput(input: Input)
}
我的问题是,这在 Java 和 Kotlin 中都能正常工作,但在 Kotlin 方面,这不是惯用的,因为我必须像这样调用它:
obj.addInputListener(object : InputListener {
override fun onInput(input: Input) {
TODO("not implemented")
}
})
而不是这个:
obj.addInputListener {
TODO("not implemented")
}
在这种情况下,编译器会抱怨类型不匹配,这是可以的。
我可以通过使用@FunctionalInterface
注释来解决这个问题,在这种情况下,Kotlin 方面会更好,但由于这是一个多平台项目,我不能使用该注释。
添加两个函数:
fun addInputListener(listener: InputListener)
fun addInputListener(listener: (Input) -> Unit)
也不起作用,因为它在 Java 方面是模棱两可的。我该如何解决这个问题,以便它在 Java 和 Kotlin 中都能惯用地工作?
我知道我可以做这样的事情:
fun addInputListener(listener: InputListener)
fun onInput(listener: (Input) -> Unit)
但在这种情况下,Java 用户在想要使用该变体时会感到困惑onInput
(因为它会解析到Function1
无法从 Java 端实例化的变量)。
这个问题有规范的解决方案吗?
解决方案
推荐阅读
- google-sheets - 我的电子表格对于 Google 表格来说是否过于占用资源?
- clojure - RocksDB 迭代器寻找直到最后一个匹配的前缀
- reactjs - Material UI Modal 不会在 Modal Paper 之外滚动
- android - 内部应用分享显示下载错误 | 从服务器检索信息时出错。DF-DFERH-01
- mysql - 在表创建mysql上添加多个索引的语法错误
- django - 如何获取 Django 模板中字段中具有特定值的所有对象的计数?
- javascript - 更改事件jQuery中忽略的条件?
- flutter - 无法识别特定状态下的内部方法,BloC 模式
- android - 无法绑定服务(尝试总是返回 false)。为什么?
- python - Chaquopy 不适用于 Android Studio 模拟器