Guice嵌套泛型类型绑定

时间:2013-11-08 17:17:23

标签: java dependency-injection guice

我正在使用guice进行依赖注入,并编写了一个返回HashMap<String, HashMap<String, String>>的提供程序。如何将HashMap.class与此提供商绑定?

我查看了this,但无法弄清楚TypeLiteral如何在HashMap中使用HashMap<K,V>值(V)。因此,我刚刚使用Object替换V中的<K,V>。目前我的丑陋绑定看起来像下面有明显的缺点。我必须获取对象并将其转换为HashMap<String, String>以获取更多值。然而,这有效,但我正在寻找一个更好的建议。

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

1 个答案:

答案 0 :(得分:3)

类型文字可以将其泛型指定为两个级别,或者深入到您希望的深度。试试这个。

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)保证它只包含HashMaps,而(2)可以包含任何地图实现。

  • 您可能会喜欢直接使用番石榴Table。它基本上是一个双键映射,可以根据需要为您创建行或列映射。