我想把一个通用接口类型的对象注入到另一个对象中
class InjectionTarget {
@Inject IGenericType<String, Integer> object;
}
interface IGenericType<A, B> {
void foo(A a);
void bar(B b);
}
class GenericTypeImpl<A, B> implements IGenericType<A, B> {
List<A> someListA = new ArrayList();
List<B> someListB = new ArrayList();
@Override
public void foo(A a) {
someListA.add(a);
}
@Override
public void bar(B b) {
someListB.add(b);
}
}
// dagger component and actual injection skipped for clarity
我尝试使用提供程序方法,但它会导致编译错误(@provides方法可能没有类型参数)
@Module
class Module {
// this doesn't compile
@Provides
<A, B> IGenericType<A, B> getGenericType() {
return new GenericTypeImpl<A, B>();
}
}
所以我不得不将类型参数从@provides方法移到类中。那么,因为:
具有类型参数的模块必须是抽象的
抽象模块不能有instance@provides方法(所有方法都必须是静态的)
不能从静态上下文引用非静态类型变量a和b
我不能再使用@provides方法(即使是静态方法,因为类型变量),所以我最终使用@injectconstructor实现@binds
@Module
public abstract class TestModule<A, B> {
@Binds
abstract IGenericType<A, B> getGenericType(GenericTypeImpl<A, B> object);
}
class GenericTypeImpl<A, B> implements IGenericType<A, B> {
...
@Inject
public GenericTypeImpl() {}
...
}
但这也失败了
如果没有@provides注解方法,则不能提供igenerictype<java.lang.string,java.lang.integer>
所以这似乎是一个无望的情况。有办法解决这个问题吗?我宁愿避免为我将要使用的每个类型组合添加提供程序方法(我希望会有许多这样的方法),而只使用一个泛型提供程序/绑定方法。
暂无答案!
目前还没有任何答案,快来回答吧!