首页 > 解决方案 > 如何在多平台项目中使用 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 端实例化的变量)。

这个问题有规范的解决方案吗?

标签: javakotlinmultiplatform

解决方案


推荐阅读