我会有一个班级,而不是发出不同类型的事件。我需要为这些事件存储听众。
代码看起来像
open class EventEmitter(
var maxListeners: Int = defaultMaxListeners
) {
private val listeners: MutableMap<String, TODO> = mutableMapOf()
fun <T> on(event: String, listener: (T) -> Unit){
listeners.set(event,listener)
}
fun <T> emit(event: String, arg: T): Boolean = TODO()
我应该使用什么而不是TODO?是否有其他方法可以存储类似的功能?
答案 0 :(得分:0)
如果这些函数都是(T) -> Unit
类型,您可以直接使用它:
open class EventEmitter<T>(var maxListeners: Int = 5) {
private val listeners: MutableMap<String, (T) -> Unit> = mutableMapOf()
fun on(event: String, listener: (T) -> Unit) {
listeners.set(event, listener)
}
fun emit(event: String, arg: T): Boolean = TODO()
}
请注意,我已将通用类型T
直接移至该类。
修改强>
由于您不接受EventEmitter是通用的,因此您需要进行一些不安全的投射:
typealias Event<T> = (T) -> Unit
open class EventEmitter(var maxListeners: Int = 5) {
private val listeners: MutableMap<String, Event<*>> = mutableMapOf()
fun <T> on(event: String, listener: Event<T>) {
listeners[event] = listener
}
fun <T> emit(event: String, arg: T): Boolean {
val listener = listeners[event] as Event<T>
listener(arg)
TODO()
}
}