我有这段代码:
val total = ListMap[String,HashMap[Int,_]]
val hm1 = new HashMap[Int,String]
val hm2 = new HashMap[Int,Int]
...
//insert values in hm1 and in hm2
...
total += "key1" -> hm1
total += "key2" -> hm2
....
val get = HashMap[Int,String] = total.get("key1") match {
case a : HashMap[Int,String] => a
}
这项工作,但我知道是否存在更好(更易读)的方法来做到这一点。 谢谢大家!
答案 0 :(得分:4)
看起来你正试图将元组重新实现为地图。
val total : ( Map[Int,String], Map[Int,Int]) = ...
def get : Map[Int,String] = total._1
答案 1 :(得分:0)
(编辑:哦,对不起,我现在就知道了)
这就是事情:上面的代码不起作用。类型参数已擦除,因此上面的匹配将始终返回true - 例如,尝试使用key2
。
如果您想在Map
上存储多种类型并将其检索到后者,则需要使用Manifest
和专门的get
和put
方法。但这已经是Stack Overflow的答案了,所以我不会在这里重复一遍。
答案 2 :(得分:0)
最好避免使用包含非统一值类型的地图的total
地图。问题是,当您在"key1"
检索地图,然后将其投射到字符串地图时,为什么选择String
?
最简单的原因可能是key1
等等只是常量,你在编写代码时就知道所有这些常量。在这种情况下,您可能应该为每个地图都有val
,并完全省略地图地图。
客户端代码发出的调用可能具有此知识。假设客户端执行stringMap(“key1”)或intMap(“key2”)或者这种或那种方式,调用意味着某些给定的类型是预期的。客户负责不混合类型和名称。在这种情况下,没有理由总计。你会得到一个字符串映射的映射,一个int映射的映射(假设你以前知道有限数量的值类型)
你有什么理由得到总数?
答案 3 :(得分:0)
首先:这是一个非答案(因为我不推荐我讨论的方法),但是评论太长了。
如果您的ListMap中没有太多不同的键,我建议尝试Malvolio的答案。 否则,由于类型擦除,基于模式匹配的其他方法实际上与此相同(有效,但非常不安全):
val get = total("key1").asInstanceOf[HashMap[Int, String]]
这是不安全的原因(除非你喜欢生活危险)是: