Лямбда-выражения в Котлине
Рассмотрим следующий класс 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
}
Генерирует ошибку несоответствия типа. Почему?
Ответы
Ответ 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!")
}
})