2016-03-03 114 views
4

我將我的應用程序從Dagger1.0轉換爲dagger2.0,並擁有一個包含許多void inject(Activity/Fragment/Receiver/etc object)方法的應用程序組件。Dagger2組件通用注入方法

隨着匕首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); 
} 

回答

3

爲什麼我就不能有一個具有一個組件方法:<T> void inject(T t);

因爲dagger-2使用代碼生成並需要在編譯時知道類型信息。沒有它,就沒有辦法確定哪個依賴項需要—,因此代碼生成是不可能的。

如果你編譯你的第一個組件,並檢查了產生Dagger*Component源代碼,你會看到每個inject方法都有自己的工廠方法,提供所有的依賴的給定類型

這與注射子類相同。您可以在組件文檔中查看段落A note about covariance。因爲超類型是已知的,所以匕首可以在超類中注入成員,但它不會注入潛在子類型的成員。同樣,因爲dagger-2依賴於編譯時代碼生成,所以這是不可能的。

+0

但Dagger1,我可以做'objectGraph.inject(anyObject)'或'調用得到(clazz所)'任何類:'噸得到(類 clazz所)' – Prem

+0

我不得不承認,我從來沒有看過dagger1接近 –

+0

Dagger 1在運行時使用反射,而不是代碼生成,因此它具有調用泛型方法所需的所有信息 –