Dagger2组件通用注入方法

8
我将我的应用从Dagger1.0转换为Dagger2.0,并且有一个应用程序组件,其中包含许多void inject(Activity/Fragment/Receiver/etc object)方法。
使用Dagger 1.0时,我只需要执行objectGraph.inject(Object object),但现在我的组件必须为每个获取依赖项注入的类定义一个方法。
为什么我不能只有一个方法的组件:<T> void inject(T t);
供参考: 目前的组件:

public interface AppComponent {

    void inject(MyFirstActivity activity);

    void inject(MySecondActivity activity);

    void inject(MyFirstFragment fragment);

    void inject(MySecondFragment fragment);

    ...
}

我需要的组件:


public interface AppComponent {
   <T> void inject(T object);
}
1个回答

6
由于dagger-2使用代码生成,需要在编译时知道类型信息。如果没有它,就无法确定T需要哪些依赖项,因此代码生成将不可能。如果编译第一个组件并检查生成的Dagger*Component源代码,您将看到每个inject方法都有自己的工厂方法,为给定类型提供所有依赖项。这对于注入子类也是一样的。您可以在组件文档中查看关于协变的注意事项。因为超类类型是已知的,dagger可以注入超类中的成员,但不会注入潜在子类型的成员。同样,因为dagger-2依赖于编译时代码生成,所以这是不可能的。

2
但是使用Dagger1,我可以执行objectGraph.inject(anyObject)或者使用任何类调用get(clazz)<T> T get(Class<T> clazz) - Prem
我必须承认,我从未仔细研究过Dagger1。 - David Medenjak
1
Dagger 1 在运行时使用反射而非代码生成,因此它拥有调用泛型方法所需的所有信息。 - Leo supports Monica Cellio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接