EventBus 型パラメータ付のイベントタイプのサポート

2018年7月20日

※EventBusについての全投稿は/tag/eventBusにある。

EventBus Ver 1.1.0から、型パラメータ付のイベントタイプをサポートするようになった。

旧来のlistenの問題点

以前のlistenの問題点としては、以下のようなケースに対応できないことだった。

public static class Foo {}
public static class Bar<T> {}
...
eventBus.listen(Bar.class, e-> ....);
...
eventBus.dispatchEvent(new Bar<Foo>(new Foo()));

Barは型パラメータ付クラスであり、実際に配信されるイベントが、Bar<Foo>という型であるとしても、以下のように記述することはできない。

eventBus.listen(Bar<Foo>.class, e-> ....);

以下のように書くしかない。

eventBus.listen(Bar.class, e-> ....);

だから、リスナー「e-> …」のところで行える処理としては、(キャストをしなければ)型パラメータ無しのBarクラスの処理しかできない。

解決方法

新たな、EventTypeというクラスを導入した。これを次のように使用する。

public static class Foo {}
public static class Bar<T> {}
...
eventBus.listen(new EventType<Bar<Foo>>() {}, e-> ....);
...
eventBus.dispatchEvent(new Bar<Foo>(new Foo()));

この場合、イベントオブジェクトの型がBarであることが示されるので、リスナーとしては正確に期待される通りに記述できる。

注意事項としては、EventTypeクラスは常に派生クラスを作成しなければならないことである。「new EventType<Bar>()」とすることはできない。なぜなら、Javaの型システムの制限として、単純にEventTypeのインスタンスとしてしまうと、型パラメータとして与えられた型を取得することができないからだ。