dagger2注入通用接口

llmtgqce  于 2021-06-30  发布在  Java
关注(0)|答案(0)|浏览(253)

我想把一个通用接口类型的对象注入到另一个对象中

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>
所以这似乎是一个无望的情况。有办法解决这个问题吗?我宁愿避免为我将要使用的每个类型组合添加提供程序方法(我希望会有许多这样的方法),而只使用一个泛型提供程序/绑定方法。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题