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

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