generics dependency-injection dagger

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:

  1. 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.
  2. 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.
  3. 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