2015-11-26 2 views
2

У меня есть rx.subjects.Subject в моих Presenter, PublishSubject.java, если быть точным. Потому что я следую шаблону DI для создания моих объектов и справочных соавторов, используя их супертипы, мне нужно ввести Subject, но PublishSubject (кроме того, последнее из final не является макетным).Как вводить rx.subjects.Subject <T, T> с кинжалом

Для того, чтобы отличить различные варианты от Subject, я представил аттестацию: @Publish.

@Qualifier @Retention(RUNTIME) public @interface Publish { }

объявили его Module:

@Module(// ...) 
public class MyModule { 

    @Provides @Publish Subject provideSubject() { 
    return PublishSubject.create(); 
    } 

} 

И указал в Presenter:

public class Presenter { 
    Subject<Void, Void> mSubject; 
    @Inject public Presenter(@Publish Subject subject) { 
    mSubject = subject; 
    } 
} 

Так, в конце Dagger (первая версия) жалуется, что не может найти Subject<Void, Void> , Так может быть и общий вопрос: как вводить общий интерфейс?

+0

В какой строке он жалуется? Я предполагаю, что введенный конструктор? –

+0

Первый кинжал не знает о его ошибках, но это определенно из-за зависимости, объявленной в конструкторе. – Eugene

+0

Можете ли вы изменить тип параметра и возврат метода предоставления на 'Subject '? –

ответ

0

Вы можете использовать класс обертки, держа свой предмет.

@Provides MySubscribtion provideMySubscription() { 
    return new MySubscribtion(PublishSubject.create()); 
} 

private class MySubscribtion { 
    private final Subject<String, String> subscription; 

    public MySubscribtion(Subject<String, String> subscription) { 
     this.subscription = subscription; 
    } 

    public Subject<String, String> get() { 
     return subscription; 
    } 
} 
Смежные вопросы