Kotlin – 高阶函数和类型不匹配

我刚开始学习kotlin,并正在努力了解高阶函数如何确定类型,我经常看到这种错误

错误:类型不匹配:推断的类型是KFunction2但(字符串) – >单位是预期的

上述错误是由以下原因引起的

class MyClass(private val valueChangeListener: MyValueChangeListener, public val storage: MyStorage): MySuperClass { fun saveValue(potentialValue: String) { super.processValue(potentialValue, MyClass::save) } fun save(value: String){ storage.storeValue(value) valueChangeListener.onValueChanged(value) } } 

但是,如果我使用Lambda全部解决

 class MyClass(private val valueChangeListener: MyValueChangeListener, public val storage: MyStorage): MySuperClass { fun saveValue(potentialValue: String) { super.processValue(potentialValue, super.processValue(potentialValue, { value: String -> save(value) }) } fun save(value: String){ storage.storeValue(value) valueChangeListener.onValueChanged(value) } } 

MySuperClass

 open class MySuperClass { private fun cleanseValue(value: String) : String { return value.toUpperCase().replace(" ", "").replace("-", "") } protected fun processValue(potentialValue: String, saveFunction: (String) -> Unit){ saveFunction(cleanseValue(potentialValue)) } } 

MyClass::save是一个KFunction2 ,这意味着它有两个参数。 这是因为这个表达式引用类的方法而不是引用当前实例的方法。 这意味着当你调用它的时候,你必须传入一个MyClass实例来调用它,以及String参数。 这使得它(MyClass, String) -> Unit功能,导致类型不匹配。

例如,你可以这样称呼它:

 class MyClass { fun test() { val s = MyClass::save s(this, "some value") } fun save(value: String) { // ... } } 

至于你在找什么,Kotlin 1.1引入了绑定可调用的引用 ,你可以用它来引用一个类的特定实例的功能:

 class MyClass(private val valueChangeListener: MyValueChangeListener, public val storage: MyStorage): MySuperClass() { fun saveValue(potentialValue: String) { super.processValue(potentialValue, this::save) // see here } fun save(value: String){ storage.storeValue(value) valueChangeListener.onValueChanged(value) } } 

在Kotlin 1.1中,可以使用成员参考来解决这个问题:

 fun saveValue(potentialValue: String) { super.processValue(potentialValue, this::save) } 

如果您使用Kotlin 1.0.X,请使用lambda:

 fun saveValue(potentialValue: String) { super.processValue(potentialValue, (arg) -> save(arg)) }