我正在使用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);
答案 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
。它基本上是一个双键映射,可以根据需要为您创建行或列映射。