Подтвердить что ты не робот

Лямбда-выражения в Котлине

Рассмотрим следующий класс 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
}

Генерирует ошибку несоответствия типа. Почему?

4b9b3361

Ответ 1

Kotlin поддерживает только конверсии SAM для Java-методов, поскольку сам Kotlin имеет типы функций. Обычно функции Котлина должны принимать () -> Unit, а не Something. Если вам действительно нужно взять Something, вы можете использовать конструктор SAM:

call(Something { /* do something */ })

Любой тип SAM (интерфейс Java с одним абстрактным методом) автоматически получает такую ​​конструкторскую функцию, которая преобразует лямбда в свой экземпляр.

Ответ 2

Kotlin требует, чтобы вызов выполнял что-то вроде интерфейса something.

() -> Kotlin.Unit

Не удовлетворяет требованию типа.

Вы можете сделать это

call (object : Something {
    override fun doSomething() {
        println("Passing an interface to call in kotlin!")
    }
})