如何在Scala中定义具有特定类型键和任何单个类型值的映射?

时间:2012-02-23 08:26:12

标签: scala map scala-collections

我需要的是像

Map[DateTime, Any]

但所有值必须是任何一个特定类型。例如,它不是一个值是Int,另一个是Double,第三个是String - 所有记录都是与Any下载相同的特定类型。

我将把地图作为参数转换为半类型不可知函数,确定匹配/大小写的类型并执行特定算法。该函数实际上将支持某些类型,并且如果不支持提供的类型则抛出异常。

1 个答案:

答案 0 :(得分:1)

我不确定你想要什么;你似乎想要的东西几乎完全是仿制药所做的,但显然我在细节上有些不同,我还没有理解。所以我猜:

如果您的投诉是地图'添加可以扩大值的类型:

scala> val m = Map(5 -> "fish")
m: scala.collection.immutable.Map[Int,java.lang.String] = Map(5 -> fish)


scala> m + ("foo" -> "dish")  // Type mismatch on key
<console>:9: error: type mismatch;
 found   : (java.lang.String, java.lang.String)
 required: (Int, ?)
              m + ("foo" -> "dish")

scala> m + (2 -> 44)  // Type mismatch on value
m + (2 -> 44)
res2: scala.collection.immutable.Map[Int,Any] = Map(5 -> fish, 2 -> 44)

然后你可以使用泛型和多个参数来阻止你提供的方法中值类型的更改:

def add[A,B](m: Map[A,B])(a: A, b: B) = m + (a -> b)


scala> add(m)(2, 44) 
<console>:10: error: type mismatch;
 found   : Int(44)
 required: java.lang.String
              add(m)(2, 44)

此处,AB的类型在到达第二个参数块之前绑定到地图中的任何类型。因此,您不必担心地图值类型的逆转。