Je ne peux pas laisser MyClass
être injecté en raison de sa nature générique.
Dague se plaint de cette erreur:
Erreur: (187, 10) erreur: com.test.MyClass a des paramètres de type, les membres ne peuvent pas injecter le type brut. via: com.test.MyComponent.inject (com.test.MyClass obj) [méthode d'injection de composant pour le type: com.test.MyClass]
J'ai googlé un peu mais je n'ai pas pu trouver de solution à ce scénario.
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();
}
}
J'ai rencontré le même problème et trouvé cet article .
En bref, vous avez ces options:
Vous pouvez utiliser dagger2 sans "injecter".
Ajouter une méthode à votre composant:
@Component(modules = CredentialsModule.class )
interface MyComponent {
void inject(MyClass obj);
UserCredentials getUserCredentials();
}
Et utilisez-le sans aucun problème:
userCredentials=Injector.getComponent().getUserCredentials();
Mais cette approche peut être peu pratique si vous avez beaucoup de champs à injecter.
Pour beaucoup, il sera utile de savoir qu'il est permis d'injecter des champs dans une classe générique, sans injecter la classe elle-même.
Il sera injecté pour vous lorsqu’une sous-classe est injectée .
Vous pouvez donc avoir:
abstract class MyClass<? extends Type> {
@Inject UserCredentials userCredentials;
// you can use it further
}
class AnotherClass extends MyClass<Type> {
// just inject this one
}