消费者在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的接受方法不存在。 然而,当我试图创建一个新的消费者,并立即使用它的接受方法在那里,并按预期工作。
http://pksv.co/go/myOeEvTE
有什么我可能错过或忽略了?
我傻。 我已经把Java钻了这么久了。 用(Event) -> Unit
代替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) } } }
- 为什么我不能在这个Rx变压器中使用接口作为通用types?
- 类型不匹配:推断类型是T,但kotlin.Any是预期的
- 如何将Gson类型适配器转换为Klaxon类型适配器
- 内联函数无法访问非公开API:@PublishedApi vs @Suppress vs @JvmSynthetic
- 如何在使用Kotlin多平台时在Firebase的Cloud Functions中包含简单的JavaScript文件作为节点依赖项?
- SetChecked()不起作用
- 是否有可能将数据类的实例解构成类的属性?
- 为什么不是Kotlin Collections中的isEmpty属性?
- 在android studio 3.0中导入项目代码类时出错