Scala 为映射中的值获取正确的数据类型

Scala 为映射中的值获取正确的数据类型,scala,map,implicit,Scala,Map,Implicit,我有一个 Map[String, Any] 映射中的值可以是任何内容,从字符串和双精度到序列和映射序列。我想创建一个函数,该函数可以识别值的类型,并在向函数输入键时返回值。 我的想法是创建一个隐式类,“扩展”scalamap库中的get函数的功能,并将其放入我的包文件中。 大概是这样的: implicit class RichMap(map: Map[String, Any]) { def getImplicit(key: String) = { val value = map.g

我有一个

Map[String, Any]
映射中的值可以是任何内容,从字符串和双精度到序列和映射序列。我想创建一个函数,该函数可以识别值的类型,并在向函数输入键时返回值。
我的想法是创建一个隐式类,“扩展”scala
map
库中的
get
函数的功能,并将其放入我的
文件中。 大概是这样的:

implicit class RichMap(map: Map[String, Any]) {
  def getImplicit(key: String) = {
    val value = map.get(key)
    value match {
      case None => throw NonExistentKeyException(key + "does not exist")
      case Some(v) => v match {
        case s: String => s
        //Other case statements
      }
    }
  }
}
myMap.getImplicit(key)
我是这样使用它的:

implicit class RichMap(map: Map[String, Any]) {
  def getImplicit(key: String) = {
    val value = map.get(key)
    value match {
      case None => throw NonExistentKeyException(key + "does not exist")
      case Some(v) => v match {
        case s: String => s
        //Other case statements
      }
    }
  }
}
myMap.getImplicit(key)

正如你所看到的,这更像是一种“暴力”方式。是否有一种更通用/优雅的方法可用于我的问题陈述?

是否要在
键下返回元素的类型(类)?那样的话,怎么样

implicit class RichMap(map: Map[String, Any]) {
  def getImplicit(key: String) = map.get(key).map(_.getClass)
}
或者,如果您确实希望抛出异常:

implicit class RichMap(map: Map[String, Any]) {
  def getImplicit(key: String) = {
    map.get(key) match {
      case None => throw NonExistentKeyException(key + "does not exist")
      case Some(v) => v.getClass
    }
  }
}

只需返回
v
。如果这不是你想要的,那么你的问题就不清楚了。模式匹配在哪方面有帮助?如果
Map
可以包含
任何类型的值,编译器就无法事先知道get方法必须返回哪个具体类型。当您有
String
Int
等的案例时,
getImplicit
的返回类型仍然是
Any