簡體   English   中英

Kotlin 中 lambda 和 KFunction 的區別

[英]The difference between lambda and KFunction in Kotlin

以下不編譯:

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)

然而,這讓我想知道:lambdas 和 KFunctions 之間有什么區別? 為什么我們需要兩者?

還有一種更簡單的方法來提供 Any::toString 作為默認操作嗎?

代碼無法編譯的原因與 lambdas 和 KFunctions 的區別無關。 它不會編譯,因為參數需要是(T) -> String類型的函數,而Any::toString(Any) -> String類型的函數。

當您使用::獲得任何函數(lambda 或其他)引用時,您正在使用反射。 KFunction是 Kotlin 環繞反射函數的方式。

至於使Any::toString工作 - 有一種方法,但您可能不喜歡它:

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

如果這樣做,它會編譯:

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

或者

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM