Я работаю над многоплатформенным проектом и пытаюсь представить 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-стороны).
Есть ли каноническое решение этой проблемы?