Java 继承与泛型和匕首2
我有两种碎片。其中一个是Java 继承与泛型和匕首2,java,android,generics,inheritance,dagger-2,Java,Android,Generics,Inheritance,Dagger 2,我有两种碎片。其中一个是ListFragment,另一个是ListWithFilterFragment,即ListWithFilterFragment扩展ListFragment。对于这些片段,我还有两个演示者,它们是ListWithFilterPresenter扩展ListPresenter。所以我为演示者定义了单独的模块,并在Dagger中定义了单独的组件。我想将正确的演示者注入到这些片段中,但出现了错误 这是列表片段: public class ListFragment<V exte
ListFragment
,另一个是ListWithFilterFragment
,即ListWithFilterFragment扩展ListFragment
。对于这些片段,我还有两个演示者,它们是ListWithFilterPresenter扩展ListPresenter
。所以我为演示者定义了单独的模块,并在Dagger中定义了单独的组件。我想将正确的演示者注入到这些片段中,但出现了错误
这是列表片段
:
public class ListFragment<V extends ListView> extends BaseFragment<V, ListPresenter<V>> implements ListView {
@Inject
ListPresenter presenter;
@NonNull
@Override
public ListPresenter createPresenter() {
DaggerListComponent.builder().build().inject((ListFragment<ListView>) this);
return presenter;
}
public class ListWithFilterFragment extends ListFragment<ListWithFilterView> implements ListWithFilterView {
@Inject
ListWithFilterPresenter presenter;
@NonNull
@Override
public ListWithFilterPresenter createPresenter() {
DaggerListWithFilterComponent.builder().build().inject(this);
return presenter;
}
}
@Singleton
@Component(modules = {ListPresenterModule.class,
ListInteractorModule.class})
public interface ListComponent {
void inject(ListFragment<ListView> fragment);
}
@Singleton
@Component(modules = {ListWithFilterPresenterModule.class,
ListInteractorModule.class})
public interface ListWithFilterComponent {
void inject(ListWithFilterFragment fragment);
}
这是列表组件
:
public class ListFragment<V extends ListView> extends BaseFragment<V, ListPresenter<V>> implements ListView {
@Inject
ListPresenter presenter;
@NonNull
@Override
public ListPresenter createPresenter() {
DaggerListComponent.builder().build().inject((ListFragment<ListView>) this);
return presenter;
}
public class ListWithFilterFragment extends ListFragment<ListWithFilterView> implements ListWithFilterView {
@Inject
ListWithFilterPresenter presenter;
@NonNull
@Override
public ListWithFilterPresenter createPresenter() {
DaggerListWithFilterComponent.builder().build().inject(this);
return presenter;
}
}
@Singleton
@Component(modules = {ListPresenterModule.class,
ListInteractorModule.class})
public interface ListComponent {
void inject(ListFragment<ListView> fragment);
}
@Singleton
@Component(modules = {ListWithFilterPresenterModule.class,
ListInteractorModule.class})
public interface ListWithFilterComponent {
void inject(ListWithFilterFragment fragment);
}
和我的演示者模块
@Module
public class ListWithFilterPresenterModule {
@Provides @NonNull @Singleton
public ListWithFilterPresenter providePresenter(ListInteractor interactor) {
return new ListWithFilterPresenter(interactor);
}
}
@Module
public class ListPresenterModule {
@Provides @NonNull @Singleton
public ListPresenter providePresenter(ListInteractor interactor) {
return new ListPresenter(interactor);
}
}
错误:(16,10)错误:如果未在注入@Provides-或@products-annotated.method.com.sober.appModules.List.presenter.ListPresenter,则无法提供com.sober.appModules.List.presenter.ListPresenter
com.sober.appModules.List.ui.ListFragment.presenter
com.sober.appModules.List.ui.ListWithFilterFragment被注入com.sober.appModules.List.injection.ListWithFilterComponent.injection(片段)
匕首不能部分注射。要么它可以提供所有对象,要么它将因无法提供而失败 在您的情况下,
ListWithFilterComponent
无法将ListPresenter
提供给ListWithFilterFragment
——或者更确切地说,它的ListFragment
父项
请参见行末尾的注释
错误:如果没有@Provides-或@products-annotated.method,则无法提供List.presenter.ListPresenter。
List.presenter.ListPresenter被注入到是否createPresenter是基类中的方法?是,这是抽象基类中的抽象方法OK。谢谢你的回复。但是我的ListWithFilterPresenter扩展了ListPresenter。为什么我需要再次注入ListPresenter?我需要当我使用ListWithFilterFragment时,Dagger只需将ListWithFilterPresenter而不是ListPresenter注入ListWithFilterPresenter。你说Dagger不能这么做?@Saber Dagger将注入整个对象,这包括父对象的任何属性。它不能只注入子类,不。你不应该再次注入ListPresenter
,而是重构你的代码并解决这个父子关系,因为这两个类似乎不应该与我相关