我想知道是否可以使用不同构造类型的值创建地图。像这样:
class WowClass[A <: HeyClass]
val map = Map[String, WowClass[A <: HeyClass]]()
这样,值可以是HeyClass
的不同子项
答案 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)