Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin中lambda和KFunction的区别_Kotlin - Fatal编程技术网

Kotlin中lambda和KFunction的区别

Kotlin中lambda和KFunction的区别,kotlin,Kotlin,以下内容未编译: fun<T> doSomething(value: T, action: (value: T) -> String = Any::toString){ //do something } fundosomething(值:T,动作:(值:T)->String=Any::toString){ //做点什么 } 错误是: Kotlin: Type mismatch: inferred type is KFunction1<Any, String>

以下内容未编译:

fun<T> doSomething(value: T, action: (value: T) -> String = Any::toString){
  //do something
}
fundosomething(值:T,动作:(值:T)->String=Any::toString){
//做点什么
}
错误是:

Kotlin: Type mismatch: inferred type is KFunction1<Any, String> but (T) -> String was expected
Kotlin:类型不匹配:推断的类型为KFunction1,但应为(T)->字符串
让它工作起来很容易:

fun<T> doSomething(value: T, action: (t: T) -> String = {t -> t.toString()}) = action(value)
fundosomething(value:T,action:T)->String={T->T.toString()})=action(value)
然而,这让我想知道:lambdas和kFunction之间的区别是什么?为什么我们两者都需要


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

代码不编译的原因与lambdas和kFunction之间的差异无关。它不会编译,因为当您获得使用反射的
::
的任何函数(lambda或其他)引用时,参数需要是类型为
(t)->String
,并且
Any::toString
是类型为
(Any)->String

的函数
KFunction
是Kotlin包装反射函数的方法

至于让
Any::toString
工作,有一种方法,但你可能不喜欢:

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

如果您这样做,它会编译:

fun <T> doSomething(value: T, action: (value: Any) -> String = Any::toString) {
    //do something
}
fundosomething(值:T,动作:(值:Any)->String=Any::toString){
//做点什么
}

fundosomething(值:T,动作:(T:T)->String=Any::toString){
// ...
}

Any:
导致问题,但用T::toString替换Any::toString也不会编译。我能通过兰姆达,但有没有简单的方法?我想没有。
fun <T : Any> doSomething(value: T, action: (t: T) -> String = Any::toString) {
    // ...
}