Я пытаюсь разработать упрощенную систему сигналов / слотов в Котлине. Вот что у меня есть:
open class Signal<T : Function<Unit>>() {
val callbacks = mutableListOf<T>()
open fun addCallback(slot: T) {
callbacks.add(slot)
}
open fun emit(vararg params: Any) {
for(call in callbacks) {
call(*params)
}
}
}
fun test(myarg: Int) = println(myarg)
fun main(args: Array<String>) {
val myevent = Signal<(Int) -> Unit>()
myevent.addCallback(::test)
myevent.emit(2)
}
Идея состоит в том, чтобы создать экземпляр Signal
вместе с универсальным шаблоном, чтобы определить, какие параметры используются для обратных вызовов. Обратные вызовы могут быть добавлены к Signal
. Наконец, всякий раз, когда Signal
должен быть ... хорошо ... "сигнализирован", используется метод emit
. Этот метод передает все параметры соответствующим обратным вызовам, если необходимо.
Проблема в том, что этот код приводит к следующей ошибке:
kotlin\Signal.kt:30:4: error: expression 'call' of type 'T' cannot be invoked as a function. The function 'invoke()' is not found
Соответствующая строка:
call(*params)
Любые рекомендации о том, как с этим справиться?