在Kotlin中传递函数引用时出现问题

时间:2019-05-31 15:08:44

标签: kotlin lambda

以下代码行引发与Renderer::onScoreChange相关的编译错误。报告的错误是: 类型不匹配。 必填:(Int, Int) → Unit 找到:KFunction3<Renderer, @ParameterName Int, @ParameterName Int, Unit>

var score by EngineObserver<Int>(20, Renderer::onScoreChange)

我试图将函数引用传递给自ObservableProperty类扩展的自定义委托,但不确定为什么它不能将传递的成员函数识别为满足函数参数的要求。有任何人的想法吗?

class EngineObserver<T>(
   initialValue: T, 
   val notify : (oldVal : T, newVal : T) -> Unit
) : ObservableProperty<T>(initialValue) {
   override fun afterChange(property: KProperty<*>, 
                            oldValue: T, 
                            newValue: T) {
        super.afterChange(property, oldValue, newValue)
        notify(oldValue, newValue)
   }
}

class Renderer {
   fun onScoreChange(oldVal : Int, newVal : Int){
      println("Score changed from $oldVal to $newVal")
   }
}

2 个答案:

答案 0 :(得分:0)

Renderer::onScoreChange是一个成员函数,其第一个参数为Renderer。 您可能需要将函数引用应用于某个实例:renderer::onScoreChange

答案 1 :(得分:0)

Miha_x64是正确的。要使代码正常工作,必须执行以下操作:

class Renderer {
    companion object {
        fun onScoreChange(oldVal: Int, newVal: Int) {
            println("Score changed from $oldVal to $newVal")
        }
    }
}

var score by EngineObserver<Int>(20, Renderer.Companion::onScoreChange)

或者,如果您有一个Renderer实例要调用该方法,则可以执行以下操作:

val renderer = Renderer()
var score by EngineObserver<Int>(20, renderer::onScoreChange)