在 Dagger 中注入泛型

Injecting Generics in Dagger

在 Dagger 中是否可以执行以下操作:

public abstract class Presenter<T extends BaseView> {

    @Inject T mView;

    public void showLoadingIndicator() {
        mView.showLoading();
    }

}

(示例模块)

public class MyModule {
    private MyView mView; //extends BaseView

    public MyModule(MyView view) {
        mView = view;
    }

    @Provides
    public BaseView provideView() {
        return mView;
    }

}

然后用上面的模块创建一个对象图并将视图注入到演示器中?

我的尝试没有奏效(通常会出现 "unknown class 'T'" 类错误)。我不确定我的配置是否有误,或者这是不受支持的功能。

有一个 simple/obvious 解决方法可以实现相同的目的,具体取决于您的其余代码的样子。

通过不使用字段注入来初始化 base presenter 的 mView 字段,您可以将其传递到构造函数中,并让模块提供它,例如:

public abstract class Presenter<T extends BaseView> {
    private final T mView;

    public Presenter(T view) {
        mView = view;
    }

    public void showLoadingIndicator() {
        mView.showLoading();
    }
}

假设它是这样使用的:

public class MainPresenter extends Presenter<MainActivity> {
    public MainPresenter(MainActivity view) {
        super(view);
    }
}

并且模块创建演示器并将视图传递给它:

@Module(injects = MainActivity.class)
public class MainModule {
    private final MainActivity mMainActivity;

    public MainModule(MainActivity mainActivity) {
        mMainActivity = mainActivity;
    }

    @Provides
    MainPresenter mainPresenter() {
        return new MainPresenter(mMainActivity);
    }
}

无论如何我更喜欢这个,因为我更喜欢构造函数注入而不是字段注入(当然不是由 Dagger 创建的对象除外,例如 activity 或片段级别,我们无法避免 @Inject).

code here