Разница между лямбда и KFunction в Котлине - PullRequest
0 голосов
/ 10 сентября 2018

Следующее не компилируется:

fun<T> doSomething(value: T, action: (value: T) -> String = Any::toString){
  //do something
}

Ошибка:

Kotlin: Type mismatch: inferred type is KFunction1<Any, String> but (T) -> String was expected

Сделать это легко:

fun<T> doSomething(value: T, action: (t: T) -> String = {t -> t.toString()}) = action(value)

Однако это оставляетмне интересно: в чем разница между лямбдами и KFunctions?Зачем нам нужны оба?

Также есть более простой способ предоставить Any :: toString в качестве действия по умолчанию?

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Когда вы получаете ссылку на любую функцию (лямбда или иным образом) с помощью ::, вы используете отражение.KFunction - это способ Котлина обернуть отраженные функции.

Что касается Any::toString работы - есть способ, но он вам может не понравиться:

fun <T> doSomething(value: T, action: (t: T) -> String = Any::toString as (T) -> String) { 
    // ...
}
0 голосов
/ 10 сентября 2018

Причина, по которой код не компилируется, не имеет никакого отношения к разнице между лямбдами и KFunctions. Он не компилируется, потому что параметр должен быть функцией типа (T) -> String, а Any::toString - функцией типа (Any) -> String.

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