2016-03-03 3 views
4

Я преобразовал свое приложение с Dagger1.0 в dagger2.0 и имею компонент приложения со многими методами void inject(Activity/Fragment/Receiver/etc object).Dagger2 component generic inject method

С 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); 
} 

ответ

3

Почему я не могу просто есть компонент, который имеет одну метод: <T> void inject(T t);?

Потому что dagger-2 использует генерацию кода и должен знать информацию о типе во время компиляции. Без него невозможно определить, какие зависимости T понадобится —, поэтому генерация кода была бы невозможна.

Если вы собираете свой первый компонент и проверить сгенерированный Dagger*Component исходный код, вы увидите, что каждый inject метод получает свой собственный фабричный метод, обеспечивающее все зависимости для данного типа.

Это то же самое для инъекций подклассов. Вы можете ознакомиться с абзацем A note about covariance в документации по компонентам. Поскольку тип суперкласса известен, кинжал может вводить члены в суперкласс, но он не будет вводить члены потенциальных подтипов. Опять же, потому что dagger-2 полагается на генерацию времени компиляции, это невозможно.

+0

но с Dagger1, я мог бы сделать 'objectGraph.inject (anyObject)' или 'называют получить (clazz)' с любым классом: ' T ПОЛУЧИТЬ (класс clazz)' – Prem

+0

я должен признать, что я никогда не смотрел на dagger1 близко –

+0

Кинжал 1 работает с отражением во время выполнения, а не с генерацией кода, поэтому у него есть вся информация, необходимая для вызова общего метода –