Как правильно обрабатывать функции SAM с Kotlin в многоплатформенном проекте? - PullRequest
0 голосов
/ 25 сентября 2018

Я работаю над многоплатформенным проектом и пытаюсь представить 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, и в этом случае сторона Котлина была бы лучше, нотак как это мультиплатформенный проект, я не могу использовать эту аннотацию.

Добавление двух функций:

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-стороны).

Есть ли каноническое решение этой проблемы?

...