Kotlin 中 lambda 和 KFunction 的区别

Dol*_*pil 6 kotlin

以下不编译:

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

错误是:

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

让它工作很容易:

fun<T> doSomething(value: T, action: (t: T) -> String = {t -> t.toString()}) = action(value)
Run Code Online (Sandbox Code Playgroud)

然而,这让我想知道:lambdas 和 KFunctions 之间有什么区别?为什么我们需要两者?

还有一种更简单的方法来提供 Any::toString 作为默认操作吗?

Dav*_*oko 1

当您获取任何函数(lambda 或其他)引用时,:: 您正在使用反射。KFunction是 Kotlin 包装反射函数的方式。

至于创作Any::toString——有一种方法,但你可能不喜欢它:

fun <T> doSomething(value: T, action: (t: T) -> String = Any::toString as (T) -> String) { 
    // ...
}
Run Code Online (Sandbox Code Playgroud)