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();
}
}
我遇到了同样的问题,并找到了
简而言之,您有以下选项:
您可以使用匕首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)
}
诀窍是获得一些您允许的泛型的公共父类(在我的情况下,我不在乎,所以我只做任何事情,这就是一切)并使用它。需要一些未经检查的强制转换,但这没关系。因此,请注意抽象类、接口和类型参数()!回答得真好!就这么简单!