Использование Generics в Base Presenter с Mosby и Dagger 2

Я пытаюсь настроить Base Presenter с помощью Mosby MvpBasePresenter в Dagger 2. У меня есть следующий базовый компонент:

public interface BaseViewComponent<V extends BaseView, P extends BasePresenter> {
    void injectView(V object);

    void injectPresenter(P object);

    P getPresenter();
}

со следующим BasePresenter

public class BasePresenter <V extends BaseView> extends MvpBasePresenter {
    @Inject public BasePresenter () {

    }
}

и следующий BaseActivity

public abstract class BaseActivity<P extends BasePresenter, C extends BaseViewComponent> extends MvpActivity implements BaseView<P> {

@Inject C mComponent;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (getViewContentId() != 0) {
        setContentView(getViewContentId());
        ButterKnife.bind(this);
    }

}

@Override
public P createPresenter() {
    return mComponent.getPresenter();
}
}

По какой-то причине презентатор создания отображается как возвращающий тип BasePresenter, а не тип P, хотя компонент getPresenter возвращает P. Кто-нибудь знает? это даже хорошая идея сделать?


person 1tSurge    schedule 16.12.2015    source источник
comment
Я не уверен, что дженерики таким образом поддерживаются, вы можете попробовать предоставить их в таких модулях, как stackoverflow.com/questions/28224927/   -  person David Medenjak    schedule 16.12.2015
comment
Не могли бы вы показать BaseView?   -  person EpicPandaForce    schedule 17.12.2015
comment
BaseView в основном просто пуст в данный момент, так что BaseView‹P›   -  person 1tSurge    schedule 18.12.2015
comment
interface BaseView extends MvpView?   -  person sockeqwe    schedule 24.12.2015


Ответы (1)


Моя первоначальная догадка такова, как и this

public interface BaseViewComponent<V extends BaseView<V, P>, P extends BasePresenter<V, P>> {
    void injectView(V object);

    void injectPresenter(P object);

    P getPresenter();
}

public class BasePresenter<V extends BaseView<V, P>, P extends BasePresenter<V, P>> extends MvpBasePresenter {
    @Inject public BasePresenter () {

    }
}

public abstract class BaseActivity<V extends BaseView<V, P>, P extends BasePresenter<V, P>, C extends BaseViewComponent<V, P>> 
    extends MvpActivity 
    implements BaseView<V, P> {

@Inject C mComponent;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (getViewContentId() != 0) {
        setContentView(getViewContentId());
        ButterKnife.bind(this);
    }

}

@Override
public P createPresenter() {
    return mComponent.getPresenter();
}
}
person EpicPandaForce    schedule 17.12.2015
comment
Казалось бы, тогда я получаю что-то вроде Error: com.hannesdorfmann.mosby.mvp.MvpBasePresenter имеет параметры типа, члены не могут вводить необработанный тип. через: injectPresenter(p object) похоже, что я не могу этого сделать - person 1tSurge; 18.12.2015
comment
На самом деле, я почти уверен, что это должно быть возможно. Хотя я думаю, что вам нужно будет использовать модули вместо конструктора @Inject. - person EpicPandaForce; 18.12.2015
comment
Хотите уточнить? я не уверен, что следую - person 1tSurge; 18.12.2015