消费者在kotlin中表现奇怪

时间:2016-01-02 23:55:04

标签: kotlin

我刚回到Kotlin(从java过渡),我注意到使用Consumer比听起来更棘手。

class EventBus(controller: Controller) {
    private val consumerMap : MutableMap<KClass<out Event>, MutableSet<Consumer<out Event>>> = ConcurrentHashMap()
    private val controller : Controller = controller

    public fun <T : Event> register(clazz: KClass<T>, handler: Consumer<T>) {
        consumerMap.getOrPut(clazz, { HashSet() }).add(handler)
    }

    public fun <T : Event> post(event : T) {
        consumerMap[event.javaClass.kotlin]?.forEachIndexed { i, handler ->
            controller.getLogger().trace("Firing handler ${i + 1} for event ${event.javaClass.name}")
            handler.accept(event)
        }
    }
}

我试图创建一个用于触发死基本事件的简单类,唯一的问题是根据IntelliJ,accept方法不存在。但是,当我尝试创建一个新的消费者并立即使用它时,接受方法就在那里并且正常工作。

http://pksv.co/go/myOeEvTE

有什么我可能错过或忽略的吗?

1 个答案:

答案 0 :(得分:4)

傻傻的我。我已经把java钻了很长时间。用Consumer<out Event>替换Consumer(以及其他(Event) -> Unit次使用)可以清除所有内容!

对于对代码感兴趣的人:

class EventBus(controller: Controller) {
    private val consumerMap : MutableMap<KClass<out Event>, MutableSet<(Event) -> Unit>> = ConcurrentHashMap()
    private val controller : Controller = controller

    public fun <T : Event> register(clazz: KClass<T>, handler: (T) -> Unit) {
        consumerMap.getOrPut(clazz, { HashSet() }).add(handler as (Event) -> Unit) // hacky cast :-)
    }

    public fun <T : Event> post(event : T) {
        consumerMap[event.javaClass.kotlin]?.forEachIndexed { i, handler ->
            controller.getLogger().trace("Firing handler ${i + 1} for event ${event.javaClass.name}")
            handler.invoke(event)
        }
    }
}