【问题标题】:cast LinkedHashMap to HashMap in groovy在groovy中将LinkedHashMap转换为HashMap
【发布时间】:2011-04-16 09:47:28
【问题描述】:

如何在 groovy 中将 LinkedHashMap 转换为 java.util.HashMap

当我在 groovy 中创建这样的东西时,它会自动创建一个 LinkedHashMap,即使我将其声明为 HashMap h = ....def HashMap h = ...

我试过了:

HashMap h = ["key1":["val1", "val2"], "key2":["val3"]]

def HashMap h = ["key1":["val1", "val2"], "key2":["val3"]]

h.getClass().getName() 仍然返回 LinkedHashMap

【问题讨论】:

  • 只是好奇,你为什么关心它正在创建的Map 的实现?

标签: java collections groovy hashmap linkedhashmap


【解决方案1】:

LinkedHashMapHashMap 的子类,因此您可以将其用作HashMap


资源:

【讨论】:

  • 我同意。我应该不管它使用什么 HashMap 实现。
【解决方案2】:
 HashMap h = new HashMap() 
 h.getClass().getName();

有效。使用 [:] 符号似乎将其与 LinkedHashMap 联系起来。

【讨论】:

    【解决方案3】:

    简单的答案——地图有一些看起来很像复制构造函数的东西:

    Map m = ['foo' : 'bar', 'baz' : 'quux'];
    HashMap h = new HashMap(m);
    

    因此,如果您固守文字符号,但您绝对必须有不同的实现,那么这将完成这项工作。

    但真正的问题是,您为什么要关心底层实现是什么?你甚至不应该关心它是一个 HashMap。它实现了 Map 接口这一事实几乎可以满足任何目的。

    【讨论】:

    • 我遇到了同样的问题,我试图通过 assertEquals("Checking Data Input Variable 5/9 - Define attr", ["male": 0, "female": 1], var5.define) 比较 assertEquals 中的 Map 并且断言失败,因为实际类型是 HashMap 而预期类型是 LinkedHashMap .也许我会使用您的建议编写自己的 assertMapEquals() 函数...
    【解决方案4】:

    他可能被可怕的 Groovy-Map-Gotcha 抓住了,就像我整个下午一样,在各种可能性的荒野中磕磕绊绊。

    这是交易:

    当使用可变字符串键时,您无法访问属性表示法格式的映射(例如 map.a.b.c),这在 Groovy 中是出乎意料的,因为一切通常都简洁而美妙;--)

    解决方法是将变量键包裹在括号中而不是引号中。

    def(a,b,c) = ['foo','bar','baz']  
    Map m = [(a):[(b):[(c):1]]]  
    println m."$a"."$b"."$c" // 1  
    println m.foo.bar.baz // also 1
    

    像这样创建地图将为全世界的虐待狂带来极大的乐趣:

    Map m = ["$a":["$b":["$c":1]]]
    

    希望这可以让另一个 Groovy 专家免于暂时的精神错乱......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-09
      • 2021-07-11
      • 2018-12-13
      • 2015-12-01
      相关资源
      最近更新 更多