具有不同类型参数化值类型的Map

时间:2012-08-03 12:08:24

标签: scala generics map type-parameter

我想知道是否可以使用不同构造类型的值创建地图。像这样:

class WowClass[A <: HeyClass]

val map = Map[String, WowClass[A <: HeyClass]]()

这样,值可以是HeyClass的不同子项

2 个答案:

答案 0 :(得分:4)

你绝对可以在地图中存储声明值类型V的子类型,但是如果你从地图中读取,你所知道的就是你得到类型V的值,即上层您的层次结构的类型绑定。如果您需要了解更多信息,则可以对值进行模式匹配。

trait V
case class A1() extends V
case class A2() extends V

var map = Map[String, V]()

map += ("A1" -> A1())
map += ("A2" -> A2())

map.values.head match {
  case a1: A1 => println("A1")
  case a2: A2 => println("A2")
}

如果这对您来说不够精确,请查看HLists。从某种意义上说,它们是n元组的类型安全实现,即具有自然数字键和任意类型值的固定大小的映射。

查看(只读)Map[K, V]作为函数K -> V可以帮助理解为什么不能直接获得具有不同类型值的映射,并且还静态地知道为每个键返回的确切类型的值。鉴于上述函数签名,如何能够静态地知道密钥"foo"返回值V1 <: V,而密钥"bar"返回类型V2 <: V的值?这些附加信息在某种程度上需要成为函数签名的一部分,实际上它就是HLists的情况。

答案 1 :(得分:1)

如果使用HLists或HMaps,Miles Sabins Shapeless将获得准确的类型。值得快速查看一下示例,看看它们是否适合您。