generics - Dagger 2 Error de inyección de clase de tipo genérico
dependency-injection (3)
Me encontré con el mismo problema y encontré este artículo .
En pocas palabras tienes estas opciones:
- Cree una clase contenedora no genérica que contenga campos inyectados, conviértalo en un campo de su clase e inyéctelo en lugar de la clase genérica en sí misma.
- Inyecte clase no genérica infantil en lugar de clase base. Todas las anotaciones con los campos @Inject de la clase base también se inyectarán, pero tienen que ser públicas / protegidas que no son buenas.
- Realice anotaciones con @Inject setter en la clase base y en el campo privado. La inyección de una clase no genérica para niños dará lugar a la activación del setter con el parámetro obtenido del gráfico del objeto.
No puedo permitir que MyClass
se inyecte aquí debido a su naturaleza genérica.
Daga se queja con este error:
Error: (187, 10) error: com.test.MyClass tiene parámetros de tipo, los miembros no pueden inyectar el tipo sin formato. via: com.test.MyComponent.inject (com.test.MyClass obj) [método de inyección de componente para tipo: com.test.MyClass]
Busqué en Google un poco, pero no pude encontrar una solución para este escenario de caso.
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();
}
}
Para muchos, será útil saber que está permitido inyectar campos en una clase genérica, sin inyectar la clase en sí.
Se inyectará cuando se inyecte una subclase .
Para que puedas tener:
abstract class MyClass<? extends Type> {
@Inject UserCredentials userCredentials;
// you can use it further
}
class AnotherClass extends MyClass<Type> {
// just inject this one
}
Puedes usar dagger2 sin "inyectar".
Agregue método a su componente:
@Component(modules = CredentialsModule.class )
interface MyComponent {
void inject(MyClass obj);
UserCredentials getUserCredentials();
}
Y úsalo sin ningún problema:
userCredentials=Injector.getComponent().getUserCredentials();
Pero este enfoque puede ser inconveniente si tiene muchos campos para inyectar