我正在开发一个多平台项目,并且试图公开一个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端是不可实例化的。)
有没有针对该问题的规范解决方案?