Generics Dagger 2泛型类型类注入错误

Generics Dagger 2泛型类型类注入错误,generics,dependency-injection,dagger,Generics,Dependency Injection,Dagger,我不能让MyClass在这里被注入,因为它是泛型的 Dagger抱怨此错误: 错误:(187,10)错误:com.test.MyClass具有类型参数,成员无法注入原始类型。通过: com.test.MyComponent.inject(com.test.MyClass obj) [类型的组件注入方法:com.test.MyClass] 我在谷歌上搜索了一下,但找不到这个案例的解决方案 class MyClass<Type> { @Inject UserCredent

我不能让
MyClass
在这里被注入,因为它是泛型的

Dagger抱怨此错误:

错误:(187,10)错误:com.test.MyClass具有类型参数,成员无法注入原始类型。通过: 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();
    }
}
class-MyClass{
@注入
用户凭证用户凭证;
结果生产者mRP;
公共MyClass(ResultProducer resultProd){
mRP=resultProd;
Injector.getComponent().Injector(此);
}
公共类型getResult(){
if(userCredentials.isLoggedIn()){
mRP.get();
}否则{
mRP.getAnonymousCache();
}
}
}
@组件(模块=CredentialsModule.class)
接口组件{
无效注入(MyClass obj);
}
@模块
类别认证模块{
@提供
公共用户凭据ProviderUserCredentials(){
返回新的UserCredentials();
}
}

我遇到了同样的问题,并找到了

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

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

  • 您可以使用匕首2而无需“注入”

    将方法添加到组件:

    @Component(modules = CredentialsModule.class )
    interface MyComponent {
    void inject(MyClass obj);
    
    UserCredentials getUserCredentials();
    }
    
    并且使用时不会出现任何问题:

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

    但是,如果您有很多字段要注入,这种方法可能会很不方便,因为很多人都知道,可以将字段注入泛型类,而不必注入类本身。
    当子类被注入时,它将被注入
    因此,您可以:

    abstract class MyClass<? extends Something> {
        @Inject UserCredentials userCredentials;
        // you can use it further
    }
    
    class AnotherClass extends MyClass<Whatever> {
        // just inject this one
    }
    

    抽象类MyClass我解决这个问题的方式有点不同,就像这样(我们还有5年,所以它在Kotlin,但我想Java也可以):

    //我要注入的类,多个泛型
    类数据存储{
    @注入
    lateinit变量thedependencyNeed:thedependencyNeed
    初始化{
    ComponentSingleton.getSomeComponent().inject(作为SomeDataStorage)
    }
    fun getValue(键:K):V{
    将dependencyNeed.doSomeStuff()作为V返回
    }
    }
    //组成部分
    接口组件{
    乐趣注入(someDataStorage:someDataStorage)
    }
    

    诀窍是获得一些您允许的泛型的公共父类(在我的情况下,我不在乎,所以我只做任何事情,这就是一切)并使用它。需要一些未经检查的强制转换,但这没关系。

    因此,请注意抽象类、接口和类型参数()!回答得真好!就这么简单!