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

Рассмотрим следующий класс 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!") } }) 
Intereting Posts
RxJava 2 требует другого типа возвращаемого типа, чем RxJava 1 (Kotlin) Делегация Котлина выражает вместо фиксированной ссылки как получить идентификатор DB только после нажатия кнопки imageButton в элементе listView с kotlin Как аргумент Default и @JvmOverloads работают над Kotlin? AndroidStudio / Kotlin – Неразрешенная ссылка: ReadWriteProperty – Kotlin версия 1.0.0-beta-1038 Kotlin – Расширение для финального класса Невозможно создать привязки вида java.lang.NullPointerException Можно ли использовать Mockito с Kotlin без открытия класса? Получить значения из файла `.properties` | свойство lateinit не было инициализировано Доступ к свойствам закрывающего класса Как получить ссылку на класс от KParameter в котлин? Kotlin: Java Util Date to String для привязки данных Markdown # против нескольких # Как проверить, имеют ли два объекта один класс в Котлине? Как использовать анонимные классы Kotlin в качестве аргументов для собственных функций JavaScript?