Kotlin:具有相似签名的函数集合

时间:2018-03-16 06:01:34

标签: generics collections kotlin

我会有一个班级,而不是发出不同类型的事件。我需要为这些事件存储听众。

代码看起来像

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?是否有其他方法可以存储类似的功能?

1 个答案:

答案 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()
    }
}