ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java-Guice嵌套通用类型绑定

2019-11-22 14:10:48  阅读:289  来源: 互联网

标签:dependency-injection guice java


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

我查看了this,但无法弄清楚如何将TypeLiteral用于HashMap< K,V>中的HashMap值(V).因此,我只是在< K,V>中替换了V.与对象.目前,我的丑陋绑定看起来像下面这样,它有明显的缺点.我必须获取对象并将其转换为HashMap< String,String>才能获取更多值.但这有效,但我正在寻找更好的建议.

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

解决方法:

类型文字可以在两个层次上指定其泛型,也可以根据需要进行指定.尝试这个.

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)可以包含任何地图实现.
>您可能会喜欢直接使用Guava Table.它基本上是一个两键映射,可以根据需要为您创建行或列映射.

标签:dependency-injection,guice,java
来源: https://codeday.me/bug/20191122/2060437.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有