2017-06-12 8 views
0

Eventクラスは私のバスとして機能しているPublishRelayに投稿したいと思っています。RxBus:一般的なイベントを送信する

私のRxBusポストイベントをジェネリック型にしたいのですが、バス自体は一般的ではありません。私は何を変える必要があるかについて私にアイデアを教えてもらえますか?あなたは、一般的なイベントを使用したい場合は

public class Event<T> { 
    protected String name; 
    protected Pair<String, T> event; 

    public String getName() { 
    return event.first; 
    } 

    public T getData() { 
    return event.second; //cast to type 
    } 

    public Event(String name, T data) { 
    event = Pair.create(name, data); 
    } 
} 

@Singleton 
public class RxBus { 

    // I want to post Event<T> 
    private final PublishRelay<Event<User>> busSubject = PublishRelay.create(); 

    public PublishRelay<Event<User>> bus() { 
    return busSubject; 
    } 

    public void post(Event<User> event) { 
    busSubject.accept(event); 
    } 
} 

答えて

1

は、あなたはそれを定義するための?ワイルドカードを使用することができます。しかし、サブスクライバーのTの実際のタイプに関する情報はありません。これを別の方法で処理しなければなりません。たぶんフィルターやキャスト。また、PublishRelayに外部からアクセスできるようにすることは良いことではありません。 Observableを返すと、この実装の詳細が隠されます。

@Singleton 
public class RxBus { 

    private final PublishRelay<Event<?>> busSubject = PublishRelay.create(); 

    public Observable<Event<?>> bus() { 
    return busSubject; 
    } 

    public void post(Event<?> event) { 
    busSubject.accept(event); 
    } 
} 
関連する問題