2015-09-10 16 views
27

Tôi không thể để MyClass ở đây được tiêm do tính chất chung của nó.Dagger 2 Lỗi loại lớp chung loại

Dagger phàn nàn với lỗi này:

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]

Tôi googled một chút nhưng không thể tìm thấy một giải pháp cho tình huống này.

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

Trả lời

39

Tôi đã gặp sự cố tương tự và tìm thấy this article.

Tóm lại bạn có các tùy chọn này:

  1. Hãy lớp wrapper không generic chứa lĩnh vực tiêm, làm cho nó trở thành một lĩnh vực lớp học của bạn và tiêm nó thay vì lớp chung thân.
  2. Tiêm lớp trẻ em không phải lớp chung thay vì lớp cơ sở. Tất cả các chú thích với các trường @Inject của lớp cơ sở cũng sẽ được tiêm, nhưng chúng phải được công khai/bảo vệ mà không tốt.
  3. Đặt chú thích với @Inject setter trong lớp cơ sở và trường riêng tư. Việc tiêm lớp non-generic non sẽ dẫn đến việc kích hoạt setter với tham số nhận được từ đồ thị đối tượng.
+0

nên xem ra các lớp trừu tượng, các giao diện và các tham số kiểu (<>)! – vanomart

3

Bạn có thể sử dụng dagger2 mà không cần "tiêm".

Add phương pháp để thành phần của bạn:

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

UserCredentials getUserCredentials(); 
} 

Và sử dụng nó mà không có bất kỳ vấn đề:

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

Nhưng phương pháp này có thể bất tiện nếu bạn có rất nhiều lĩnh vực để tiêm

Các vấn đề liên quan