3

私は依存性注入に Guice を使用しており、 を返すプロバイダーを作成しました HashMap<String, HashMap<String, String>>HashMap.classこのプロバイダーとバインドするにはどうすればよいですか?

これを見ましTypeLiteralが、 のHashMap値 (V)の使い方がわかりませんでしたHashMap<K,V>。したがって、Vin<K,V>を Object に置き換えただけです。現在、私の醜いバインディングは以下のように見えますが、これには明らかな欠点があります。HashMap<String, String>さらに値を取得するには、オブジェクトを取得してキャストする必要があります。ただし、これは機能しますが、より良い提案を探しています。

    binder().bind(new TypeLiteral<Map<String, Object>>() {}).toProvider(
(Class<? extends Provider<? extends Map<String, Object>>>) TestProvider.class);
4

1 に答える 1

3

型リテラルでは、ジェネリックを 2 レベルの深さで指定することも、必要なだけ深く指定することもできます。これを試して。

class TestProvider implements Provider<Map<String, Map<String, String>>> {
  @Override public Map<String, Map<String, String>> get() {
    // If you had Guava, you could just call "return Maps.newHashMap();".
    // On Java 7, you can use "return new HashMap<>();".
    return new HashMap<String, Map<String, String>>();
  }
}

class TestModule extends AbstractModule {
  @Override protected void configure() {
    bind(new TypeLiteral<Map<String, Map<String, String>>>() {})
        .toProvider(TestProvider.class);
    // or
    bind(new TypeLiteral<HashMap<String, HashMap<String, String>>>() {})
        .toProvider(HashMapTestProvider.class);
  }
}
  • 実装ではなくインターフェイスを優先し、次の点に注意してください。

                          HashMap<String, HashMap<String, String>>
           can be cast to     Map<String, HashMap<String, String>>  (1)
    but cannot be cast to     Map<String,     Map<String, String>>  (2)
    

    (1) 上記は HashMap のみを含むことを保証しますが、(2) は任意のマップ実装を含むことができます。

  • Tableグアバを直接使用していただければ幸いです。これは基本的に 2 つのキー マップであり、必要に応じて行マップまたは列マップを作成できます。

于 2013-11-08T18:06:34.770 に答える