Выбор ответа Junior Java-интероп обновлено

SAM-конверсия Java-интерфейсов

Вопрос

Почему в Kotlin можно написать executor.execute { doWork() }, хотя метод принимает Runnable?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: SAM-конверсия: лямбда становится реализацией Java-интерфейса. SAM-конверсия работает для любого Java-интерфейса с одним абстрактным методом: Runnable, Callable, Comparator, OnClickListener.

Варианты ответа

  1. Runnable в Kotlin заменён на функциональный тип () -> Unit
  2. Это особый случай, который работает только для Runnable
  3. Kotlin генерирует наследника Executor с перегрузкой для лямбды
  4. SAM-конверсия: лямбда становится реализацией Java-интерфейсаправильный ответ

Разбор

SAM-конверсия работает для любого Java-интерфейса с одним абстрактным методом: Runnable, Callable, Comparator, OnClickListener. Лямбда становится его реализацией. Для своих Kotlin-интерфейсов то же поведение включает fun interface. Runnable остаётся Java-интерфейсом, наследник Executor не создаётся.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме