如何在多平台项目中使用Kotlin正确处理SAM功能?

时间:2018-09-25 13:42:04

标签: java kotlin multiplatform

我正在开发一个多平台项目,并且试图公开一个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端是不可实例化的。)

有没有针对该问题的规范解决方案?

0 个答案:

没有答案