我在我的Scala項目中使用Guava的EventBus
。繞過Scala類型擦除(帶番石榴EventBus)
我有一個參數化的事件,像這樣:
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")
}
}
我可以創建com.google.common.eventbus.EventBus
,註冊MyEventListener
,並觸發一個事件:
val eventBus = new EventBus
eventBus.register(new MyEventListener)
eventBus.post(new MyEvent[String])
但是,正如您可能已經猜到的那樣,onStringEvent
和onIntEvent
作爲結果被調用。問題在於,Java的/ Scala的類型擦除在運行時會脫離參數類型,並且這兩個訂閱在Guava中都顯示爲event: MyEvent
。
好吧,我的問題:
由於擦除,使用相同的事件對象的不同類型以這種方式番石榴事件不會在Java中是可能的和不可能在Scala中。但是,Scala證明有很多好方法來規避Java的擦除問題。有沒有人看到另一種方式來實現這一點,也許使用一些Scala巫術?
我想你可以使用implicits/typeclasses來刪除一些語法。 –
@ DominicBou-Samra - 如果你有一個例子,你可以自由發表一個例子。對於基本情況 - 實例化MyEventString'沒關係 - 我不知道有什麼方法可以進一步減少樣板。我已經提出了泛型實例化的類型類(但是不可避免地增加了另一個樣板AFAICT)。 –