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
,而是重构你的代码并解决这个父子关系,因为这两个类似乎不应该与我相关