2015-09-10 17 views
27

Ich bin nicht in der Lage zu lassen MyClass hier aufgrund seiner generischen Natur injiziert werden.Dolch 2 Generic Typ Klasse inject Fehler

Dolch klagt mit diesem Fehler:

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]

mir ein wenig gegoogelt aber war nicht in der Lage, eine Lösung zu diesem Fall zu finden.

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

Antwort

39

Ich habe in der gleichen Ausgabe führen und this article gefunden.

Auf den Punkt gebracht Sie haben diese Möglichkeiten:

  1. Machen Sie nicht generisch Wrapper-Klasse injiziert Felder enthält, machen es zu einem Feld der Klasse zu sein und es statt generische Klasse selbst injizieren.
  2. Inject Kind nicht-generische Klasse statt Basisklasse. Alle mit @Inject-Feldern der Basisklasse annotierten Felder werden ebenfalls eingefügt, müssen jedoch öffentlich/geschützt sein, was nicht gut ist.
  3. Machen Sie mit @Inject Setter in der Basisklasse und privaten Feld kommentiert. Das Einfügen einer untergeordneten nicht-generischen Klasse führt zum Auslösen des Setter mit dem aus dem Objektgraphen erhaltenen Parameter.
+0

so zu injizieren Achten Sie auf abstrakte Klassen, Schnittstellen und Typparameter (<>)! – vanomart

3

Sie können dagger2 ohne "inject" verwenden.

Add-Methode, um Ihre Komponente:

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

UserCredentials getUserCredentials(); 
} 

Und es ohne Probleme verwenden:

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

Aber dieser Ansatz kann unbequem sein, wenn Sie viele Felder haben