2017-06-12 79 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); 
    } 
}