以下不编译:
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 作为默认操作吗?
当您获取任何函数(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)
| 归档时间: |
|
| 查看次数: |
1471 次 |
| 最近记录: |