2015-09-10 20 views
27

Non riesco a consentire a MyClass di essere iniettato a causa della sua natura generica.Errore di tipo generico di classe Dagger 2 iniettore

Pugnale lamenta con questo errore:

Error:(187, 10) error: com.test.MyClass has type parameters, cannot members inject the raw type. via: com.test.MyComponent.inject(com.test.MyClass obj) [component injection method for type: com.test.MyClass]

I googled un po ', ma era in grado di trovare una soluzione a questo scenario.

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

risposta

39

Ho incontrato lo stesso problema e ho trovato this article.

In poche parole si dispone di questa opzione:

  1. apportate non generica classe wrapper che contiene campi iniettato, farlo per essere un campo della classe e iniettare al posto di classe generica stessa.
  2. Inject classe figlio non generica anziché classe base. Verranno iniettate anche tutte le annotazioni con i campi @Inject della classe base, ma devono essere pubbliche/protette che non sono buone.
  3. Crea annotato con setter @Inject nella classe base e nel campo privato. Iniettando una classe non generica per bambini, si otterrà l'attivazione del setter con parametro ottenuto dal grafico dell'oggetto.
+0

così fai attenzione alle classi astratte, alle interfacce e ai parametri di tipo (<>)! – vanomart

3

È possibile utilizzare dagger2 senza "iniettare".

Add metodo per il componente:

@Component(modules = CredentialsModule.class) 
interface MyComponent { 
void inject(MyClass obj); 

UserCredentials getUserCredentials(); 
} 

e utilizzarlo senza problemi:

userCredentials=Injector.getComponent().getUserCredentials(); 

Ma questo approccio può essere scomodo se si hanno un sacco di campi per iniettare