1

私はEventBusScalaプロジェクトで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")
    }

}

イベントを作成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です。

わかりました、私の質問:

消去のため、この方法で異なるタイプのGuavaイベントに同じEventオブジェクトを使用することは、Javaでは不可能であり、Scalaでは不可能です。ただし、Scalaには、Javaの消去の問題を回避するための優れた方法がいくつかあることが証明されています。誰かがこれを達成するための別の方法を見ていますか?おそらくScalaの魔法を使っていますか?

4

1 に答える 1

4

問題はGuavaにあります。typeパラメーターを認識できないため、2つのメソッドを区別できません。考えられる唯一の解決策は、タイプごとに新しいクラスを作成することです。

それは本当に簡単です:

class MyEvent[T] protected () { /* Your methods here */ }
class MyEventInt extends MyEvent[Int] {}
class MyEventString extends MyEvent[String] {}

そして、コードで何かをする必要があるときはいつでも、を使用してくださいMyEvent[Int]。しかし、グアバは少なくともこれだけの定型文を必要とします。

MyEvent[T]コンストラクターを保護したので、非生成化されたクラスの1つをインスタンス化する必要があることに注意してください。それがあなたのユースケースでうまくいくかどうかはわかりません。そうだと思います。(型クラスを使用して)それを回避することもできますが、ボイラープレートが追加されます。

于 2012-12-27T22:11:35.177 に答える