2015-09-10 30 views
27

MyClass Burada Genel yapısı nedeniyle enjekte edilemiyorum.Hançer 2 Genel Tür sınıfı hata enjekte

Dagger bu hata ile yakınır:

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]

Biraz googled ancak bu durum senaryosu için bir çözüm bulamadı.

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

cevap

39

Aynı sorunu çalıştırmak ve this article bulduk. Özetle

Bu seçenekler vardır:

  1. enjekte alanları içermeyen jenerik sarmalayıcı sınıf olun, sizin sınıfın bir saha olmaya yapmak yerine jenerik sınıfa kendisinin enjekte.
  2. Alt sınıf yerine alt sınıf olmayan bir sınıf sınıfı enjekte edin. Temel sınıfın @Inject alanları ile ek açıklamada bulunulur, ancak kamuya açık olmalı/iyi değil.
  3. Temel sınıftaki ve özel alandaki @Inject setter ile açıklamayı yapın. Çocuk olmayan jenerik sınıfın enjekte edilmesi, ayarlayıcıyı nesne grafiğinden alınan parametre ile tetiklemeye neden olacaktır.
+0

enjekte etmek alanların bir sürü varsa bu yaklaşım sakıncalı olabilir soyut sınıflar, arayüzler ve tip parametrelerine dikkat edin (<>)! – vanomart

3

"Enject" olmadan dagger2'yi kullanabilirsiniz.

Ekleme sizin bileşene yöntemi: sorunsuz

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

UserCredentials getUserCredentials(); 
} 

Ve kullanmak:

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

Ama öyle