2017-05-24 14 views
4

ダガー2では、Map<Class<? extends Foo>, Provider<? extends Foo>>を注射することは可能ですか?ダガー2:マップ<Class <?を挿入する方法extends Foo>、Provider <? Foo >>

と仮定は、私がFoo

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

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

を拡張するクラスのカップルを持っているし、今は

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

を宣言することによってFooFactoryを作成したい私は、最小限の構成でダガー2でこれを行うことができますか?私は約Multibindingを読んだが、私はそれを働かせることができなかった。

答えて

6

guidelinesに従って自分の質問に答える。


まず、あなたはProvider<? extends Foo>でワイルドカードを取り除く必要があります。

第二に、あなたはマップキーのための注釈を宣言する必要があります:

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

その後、Fooの各実装のためにあなたがModuleに宣言する必要があります:

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

あなたは 'もしかして@ '@ ViewModelKey'の代わりに' FooKey(Bar.class) 'を使用します。 –

+0

@DavidMedenjakはい、ありがとうございます。私は答えを編集した –

関連する問題

 関連する問題