匕首2:如何注入Map <Class ,Provider >

在Dagger 2中,是否可以注入Map<Class, Provider> Map<Class, Provider> Map<Class, Provider>

假设,我有几个扩展Foo的类

 class Bar extends Foo { @Inject Bar() {} } class Baz extends Foo { @Inject Baz() {} } 

现在我想通过声明来创建一个FooFactory

 class FooFactory { @Inject FooFactory(Map<Class, Provider> providers) {} } 

我能用最少的配置在Dagger 2中做到这一点吗? 我读过有关Multibinding但我无法使用它。

根据指南回答我自己的问题。


首先,你必须摆脱Provider中的通配符Provider Provider

其次,您需要为地图键声明一个注释:

 @Documented @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @MapKey public @interface FooKey { Class value(); } 

然后,对于Foo每个实现,您需要在Module声明:

 @Binds @IntoMap @FooKey(Bar.class) abstract Foo bindBar(Bar bar)