消费者在 kotlin 中行为异常
Consumer acting oddly in 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)
}
}
}
我正在尝试制作一个简单的 class 来触发无效的基本事件,唯一的问题是根据 IntelliJ 的说法,accept 方法不存在。但是,当我尝试创建一个新的消费者并立即使用它时,accept 方法就在那里并且按预期工作。
有什么我可能遗漏或忽略的吗?
傻我。 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)
}
}
}
我刚回到 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)
}
}
}
我正在尝试制作一个简单的 class 来触发无效的基本事件,唯一的问题是根据 IntelliJ 的说法,accept 方法不存在。但是,当我尝试创建一个新的消费者并立即使用它时,accept 方法就在那里并且按预期工作。
有什么我可能遗漏或忽略的吗?
傻我。 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)
}
}
}