這是我的基本CMap,它將類(任何T的類[T])映射到任何類型的值。在Scala中綁定存在類型
scala> type CMap = Map[Class[T] forSome{type T}, Any]
defined type alias CMap
scala> val cMap: CMap = Map(classOf[Int]->5, classOf[String]->"abc", classOf[Double]->"ddd")
cMap: CMap = Map(int -> 5, class java.lang.String -> abc, double -> ddd)
現在我想要一個「綁定」CMap(稱之爲CMapBind)。像CMap一樣,它將類(任何類)映射爲值(任何值)。但是,與CMAP的,CMapBind具有鍵和值之間的一種類型的結合,這意味着我希望以下行爲:
val cMapBind: CMapBind = Map(classOf[Int]->5, classOf[String]-> "aa") // should compile
val cMapBind: CMapBind = Map(classOf[Int]->5, classOf[String]-> 0) // should fail compile
如何實現CMapBind?
我知道以下兩個不會在語法上/邏輯上起作用。
scala> type CMapBind = Map[Class[T] forSome{type T}, T]
<console>:8: error: not found: type T
type CMapBind = Map[Class[T] forSome{type T}, T]
scala> type CMapBind = Map[Class[T], T] forSome{type T}
scala> val cMapBind: CMapBind = Map(classOf[Int]->5, classOf[String]->"str")
<console>:8: error: type mismatch;
found : scala.collection.immutable.Map[Class[_ >: String with Int],Any]
required: CMapBind
(which expands to) Map[Class[T],T] forSome { type T }
val cMapBind: CMapBind = Map(classOf[Int]->5, classOf[String]->"str")
請注意,在這裏我使用類型構造函數Class [T]作爲示例來說明問題。在我的代碼中,我有自己的類型,例如trait Animal[S, T], class Dog extends Animal[Int, String]
。
編輯1: 我應該提到我使用不可變的Map作爲例子,但我真正需要的是一個可變的異構Map)。
見https://github.com/akka/akka/blob/90b05abc061b2a677179d89aa64156b48a8a6afb/akka-actor/src/main/scala/akka/util/TypedMultiMap.scala – ghik 2015-03-31 19:52:50
不知道這是可能的(在某種程度上要做它),由於類型擦除。這張地圖總是會丟失數值類型(上限爲'Any'),並且鍵的類型將一直是混合的。認爲你需要一種異構的'Map'來保存類型。 – DaunnC 2015-03-31 21:35:32
是的,像''無形'''HMap'異質地圖是我正在看。 – Causality 2015-03-31 21:43:24