我EventBus
在我的 Scala 项目中使用 Guava。
我有一个像这样的参数化事件:
class MyEvent[T]
还有一个简单的事件监听器:
class MyEventListener {
@Subscribe
def onStringEvent(event: MyEvent[String]) {
println("String event caught")
}
@Subscribe
def onIntEvent(event: MyEvent[Int]) {
println("Int event caught")
}
}
我可以创建 my com.google.common.eventbus.EventBus
、 registerMyEventListener
和触发事件:
val eventBus = new EventBus
eventBus.register(new MyEventListener)
eventBus.post(new MyEvent[String])
但是,正如您可能已经猜到的那样,两者都onStringEvent
被onIntEvent
调用。问题是 Java/Scala 的类型擦除会在运行时删除参数类型,并且两个订阅在 Guava 中都显示为event: MyEvent
.
好的,我的问题:
由于擦除,以这种方式对不同类型的 Guava 事件使用相同的 Event 对象在 Java 中是不可能的,在 Scala 中也是不可能的。然而,Scala 被证明有许多很好的方法来规避 Java 的擦除问题。有没有人看到另一种方法来实现这一点,也许使用一些 Scala 魔法?