Dagger 2 Generic Type类注入错误

And*_*ega 35 generics dependency-injection dagger

MyClass由于它的通用特性,我无法让这里注入.

Dagger抱怨这个错误:

错误:(187,10)错误:com.test.MyClass有类型参数,不能成员注入原始类型.via:com.test.MyComponent.inject(com.test.MyClass obj)[类型的组件注入方法:com.test.MyClass]

我用谷歌搜索了一下但无法找到这种情况的解决方案.

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

lob*_*zik 48

我遇到了同样的问题,发现了这篇文章.

简而言之,您有以下选择:

  1. 不要使用包含注入字段的通用包装类,使其成为类的字段并注入它而不是泛型类本身.
  2. 注入子非泛型类而不是基类.所有注释了基类的@Inject字段也将被注入,但它们必须是公共的/受保护的,这是不好的.
  3. 使用基类和私有字段中的@Inject setter进行注释.注入子非泛型类将导致使用从对象图获得的参数触发setter.


Leo*_*der 8

对于许多人来说,了解很有用,它允许将字段注入到通用类中,而无需注入类本身。当注入一个子类时
,它将为您注入
因此,您可以:

abstract class MyClass<? extends Something> {
    @Inject UserCredentials userCredentials;
    // you can use it further
}

class AnotherClass extends MyClass<Whatever> {
    // just inject this one
}
Run Code Online (Sandbox Code Playgroud)

  • 辉煌的答案!就如此容易! (2认同)

ale*_*shr 5

您可以使用不带“注入”的dagger2。

将方法添加到您的组件:

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

UserCredentials getUserCredentials();
}
Run Code Online (Sandbox Code Playgroud)

并使用它没有任何问题:

userCredentials=Injector.getComponent().getUserCredentials();
Run Code Online (Sandbox Code Playgroud)

但是,如果您要注入很多字段,这种方法可能会很不方便