Ошибка при загрузке в стиле Dagger 2 Generic Type
Я не могу позволить MyClass
вводить его из-за его общей природы.
Кинжал жалуется на эту ошибку:
Ошибка: (187, 10) error: com.test.MyClass имеет параметры типа, не могут ли члены вводить исходный тип. с помощью: com.test.MyComponent.inject(com.test.MyClass obj) [метод вставки компонентов для типа: com.test.MyClass]
Я немного искал Google, но не смог найти решение для этого сценария.
class MyClass<Type> {
@Inject
UserCredentials userCredentials;
ResultProducer<Type> mRP;
public MyClass(ResultProducer<Type> resultProd) {
mRP = resultProd;
Injector.getComponent().inject(this);
}
public Type getResult() {
if (userCredentials.isLoggedIn()) {
mRP.get();
} else {
mRP.getAnonymousCache();
}
}
}
@Component(modules = CredentialsModule.class )
interface MyComponent {
void inject(MyClass obj);
}
@Module
class CredentialsModule {
@Provides
public UserCredentials provideUserCredentials() {
return new UserCredentials();
}
}
Ответы
Ответ 1
Я столкнулся с той же проблемой и нашел эту статью.
В двух словах у вас есть следующие опции:
- Сделать не общий класс-оболочку, содержащий введенные поля, сделать его полем вашего класса и ввести его вместо самого общего класса.
- Внедрить дочерний не общий класс вместо базового класса. Все аннотированные полями @Inject базового класса также будут введены, но они должны быть общедоступными/защищенными, что не очень хорошо.
- Сделать аннотирование с помощью @Inject setter в базовом классе и в частном поле. Внедрение дочернего не общего класса приведет к запуску сеттера с параметром, полученным из графа объектов.
Ответ 2
Многим будет полезно знать, что он позволяет вводить поля в общий класс, не вводя сам класс.
Он будет введен для вас, когда будет введен подкласс.
Таким образом, вы можете иметь:
abstract class MyClass<? extends Something> {
@Inject UserCredentials userCredentials;
// you can use it further
}
class AnotherClass extends MyClass<Whatever> {
// just inject this one
}
Ответ 3
Вы можете использовать dagger2 без "инъекции".
Добавьте метод к вашему компоненту:
@Component(modules = CredentialsModule.class )
interface MyComponent {
void inject(MyClass obj);
UserCredentials getUserCredentials();
}
И используйте его без проблем:
userCredentials=Injector.getComponent().getUserCredentials();
Но этот подход может быть неудобным, если у вас есть много полей для ввода