Kotlin лямбда-компиляция против API Java, но не против моей собственной функции - PullRequest
0 голосов
/ 27 апреля 2018

Вот упрощенный пример. Этот синтаксис работает:

Handler().post({Log.v(TAG, "test")})

Однако, если я определю эту функцию

private fun doWithRunnable(toRun:Runnable) {
    // whatever
}

И назови это так

doWithRunnable({Log.v(TAG, "test")})

Тогда я получаю следующую ошибку:

Обязательно: Runnable
Найдено: () -> Int

Обе подписи для меня выглядят совершенно одинаково ... в чем разница?

1 Ответ

0 голосов
/ 27 апреля 2018

В вашем примере с Java вы используете функцию взаимодействия с Java для SAM Conversions . К сожалению, в настоящее время это не работает для интерфейсов Kotlin, так как дизайнеры посчитали это ненужным (некоторые обсуждения по этому поводу см. здесь ).

Вместо этого вы хотели бы сделать что-то вроде:

fun doWithRunnable(runnable: () -> Any) {
    // call it as `runnable()`
}

Вы также можете определить typealias для этого, если хотите (что настолько близко, что Kotlin подходит к синтаксису SAM):

typealias RunMe = () -> Any

fun doWithRunnable(runnable: RunMe) {
    runnable()
}

Обратите внимание, что в настоящее время typealiases должны быть объявлены на верхнем уровне, они не могут быть объявлены внутри класса или метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...