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) {
// ...
}