我将我的应用从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);
}
答案 0 :(得分:3)
为什么我的组件只有一种方法:
<T> void inject(T t);
?
因为dagger-2
使用代码生成并且需要在编译时知道类型信息。没有它,就无法确定哪些依赖项T
需要 - 因此代码生成是不可能的。
如果编译第一个组件并查看生成的Dagger*Component
源代码,您将看到每个inject
方法都有自己的工厂方法,为给定的所有依赖项提供输入的
注入子类时也是如此。您可以在组件文档中查看 A note about covariance 段落。因为超类类型是已知的,所以dagger可以在超类中注入成员,但它不会注入潜在子类型的成员。同样,因为dagger-2
依赖于编译时代码生成,所以这是不可能的。