Проблема передачи ссылки на функцию в Kotlin - PullRequest
0 голосов
/ 31 мая 2019

Следующая строка кода вызывает ошибку компиляции, связанную с 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 голосов
/ 01 июня 2019

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)
0 голосов
/ 31 мая 2019

Renderer::onScoreChange - это функция-член, в качестве первого параметра которой Renderer.Возможно, вам нужна ссылка на функцию, примененную к определенному экземпляру: renderer::onScoreChange

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...