[英]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.