Рассмотрим следующий класс Java:
public class SomeClass { public interface Something { void doSomething(); } public void call(Something something) {} }
В Котлине я могу использовать выражение лямбда следующим образом:
SomeClass().call { // do something }
Но если я определяю следующий метод в Котлине (используя тот же интерфейс):
fun call(something: Something) {}
Затем этот вызов:
call { // do something }
Генерирует ошибку несоответствия типа. Зачем?
Kotlin поддерживает только конверсии SAM для Java-методов, поскольку сам Kotlin имеет типы функций. Обычно функции Котлина должны принимать () -> Unit
а не Something
. Если вам действительно нужно что- Something
предпринять, вы можете использовать конструктор SAM:
call(Something { /* do something */ })
Любой тип SAM (Java-интерфейс с одним абстрактным методом) автоматически получает такую конструкторскую функцию, которая преобразует лямбда в свой экземпляр.
Котлин требует, чтобы вызов что-то использовал для интерфейса.
() -> Kotlin.Unit
Не удовлетворяет требованию типа.
Вы можете сделать это
call (object : Something { override fun doSomething() { println("Passing an interface to call in kotlin!") } })