首页 文章

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

提问于
浏览
0

我刚刚开始学习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))
    }
}

2 回答

  • 2

    MyClass::saveKFunction2 ,这意味着它有两个参数 . 这是因为此表达式引用类的方法,而不是引用您拥有的当前实例的方法 . 这意味着当你调用它时,你必须传入一个 MyClass 实例来调用它,以及 String 参数 . 这使它成为 (MyClass, String) -> Unit 函数,导致类型不匹配 .

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

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

    至于你在寻找什么,Kotlin 1.1引入了bound callable references,您可以用它来引用类的特定实例的函数:

    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)
        }
    
    }
    
  • 2

    在Kotlin 1.1中,您可以使用member reference来解决此问题:

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

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

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

相关问题