3

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

我查看了这个,但无法弄清楚如何使用TypeLiteral. 因此,我只是将in替换为Object。目前我的丑陋绑定如下所示,它有明显的缺点。我必须获取对象并将其强制转换以获取更多值。但是,这可行,但我正在寻找更好的建议。HashMapHashMap<K,V>V<K,V>HashMap<String, String>

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

1 回答 1

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) 可以包含任何 map 实现。

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

于 2013-11-08T18:06:34.770 回答