Kotlin中的lambda和KFunction之间的区别

时间:2018-09-10 13:17:29

标签: kotlin

以下内容无法编译:

Worktime

错误是:

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

但是,这让我想知道:lambda和KFunction之间有什么区别?为什么我们都需要?

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

3 个答案:

答案 0 :(得分:2)

代码无法编译的原因与lambda和KFunction之间的差异无关。它不会编译,因为参数必须是类型(T) -> String的函数,而Any::toString是类型(Any) -> String的函数。

答案 1 :(得分:1)

当您使用<template> <div> <input :value="someValue" /> </div> </template> <script> export default { props: ['value'] } </script> 获得任何函数(lambda或其他)引用时,您正在使用反射。 @change.native是Kotlin环绕反射函数的方式。

关于使<div>工作-有一种方法,但您可能不喜欢它:

::

答案 2 :(得分:0)

如果这样做,它将被编译:

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