2010-06-05 37 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 

这或许还算不上你想要的东西(这只是一个类型安全的地图),但我实在不明白在这一刻更好的解决办法。

相关问题