2010-06-05 39 views
3

我想創建一個地圖類型,因此類似下面的可能:如何創建允許多種類型的鍵和值的Map類型?

VariantMap(1) = "Test" 
VariantMap("a") = 42 

VariantMap("a")將有一個類型的Option[Int]。這是我迄今導致Option[Nothing]代碼:

object VariantMap { 
    import scala.reflect.Manifest 

    private var _map= Map.empty[Any,(Manifest[_], Any)] 

    def update[T](name: Any, item: T)(implicit m: Manifest[T]) { 
    _map = _map(name) = (m, item) 
    } 

    def apply[T](key:Any)(implicit m : Manifest[T]) = { 
    val o = _map.get(key) 

    o match { 
     case Some((om: Manifest[_], s : Any)) => Some[T](s.asInstanceOf[T]) 
     case _ => None 
    } 
    } 
} 

我是新來斯卡拉所以我道歉,如果我失去了一些東西明顯。

+0

是否有鍵/值類型的固定模式?或者你只是有幾種關鍵類型和幾種價值類型,前者中的任何一種與後者中的任何一種相關聯?或者它只是對任何事情而言?在這種情況下,只需使用Map [A​​ny,Any]並使用匹配作爲輸出值的類型大小寫。 – 2010-06-05 14:14:51

回答

2

我不確定是否可以直接做你想做的事。 apply方法接受一個類型參數[T],但是如果你沒有指定它,編譯器不知道T代表什麼類型。在這種情況下,它推斷Nothing,任何其他類型的子類型。

使用你的代碼,提供類型參數給出了以下結果:


scala> VariantMap[Int]("a") 
res0: Option[Int] = Some(1) 

scala> VariantMap[String]("a") 
res1: Option[String] = Some(1) 

所以,現在,任何類型是確定的,不完全是完美的。 你可以稍微提高以下變化:


object VariantMap { 
    import scala.reflect.Manifest 

    private var _map= Map.empty[Any,(Manifest[_], Any)] 

    def update[T](name: Any, item: T)(implicit m: Manifest[T]) { 
     _map = _map(name) = (m, item) 
    } 

    def apply[T](key:Any)(implicit m : Manifest[T]): Option[T] = { 
    val o = _map.get(key)  
    o match { 
     case Some((om: Manifest[_], s : Any)) => if (om None 
    } 
    } 
} 

scala> VariantMap("a") 
res0: Option[Nothing] = None 

scala> VariantMap[Int]("a") 
res1: Option[Int] = Some(1) 

scala> VariantMap[String]("a") 
res2: Option[String] = None 

這或許還算不上你想要的東西(這只是一個類型安全的地圖),但我實在不明白在這一刻更好的解決辦法。

相關問題