如何知道 Scala 中 Map 值 Map("key->"value") 的类型?

How to know type of Map value Map("key->"value") in Scala?

我对 Map("id") 的值有疑问,它可能有两种类型:String 或 Map[String,String]。

Case 1: val a = Map("id" -> "123")
Case 2: val a = Map("id"-> Map("ide"->"abcd"))

我想像这样检查 Match case :

def d = a.get("id") match {

  case _:String => "String"
  case _:Map[String,Any] => "Map"


}

有没有人知道我应该如何处理这个案子?

您的代码几乎是正确的。地图上的方法 get returns 一个 Option。您需要做的就是将值包装在匹配项中。所以你可以这样做:

val a1 = Map("id" -> "123")
val a2 = Map("id" -> Map("ide" -> "abcd"))
val a3 = Map("id" -> 42)

def d(map: Map[String, Any]) = map.get("id") match {
  case Some(_: String) => "String"
  case Some(_: Map[String,Any]) => "Map"
  case _ => "Other"

}

d(a1) // "String"
d(a2) // "Map"
d(a3) // "Other"

UPD:正如@Luis 所指出的,由于类型擦除,第二种情况将匹配任何 Map。如果您想匹配特定的 Map

,请参阅他的回答

根据 Dmitry 的回答进行了细微修改。此代码段使用 TypeTagOvercome type erasure

import scala.reflect.runtime.universe.{TypeTag, typeOf}

def d[T](map: Map[String, T])(implicit T: TypeTag[T]) = map.get("id") match {
  case Some(_) if T == typeOf[String] => "String"
  case Some(_) if T == typeOf[Map[String, String]] => "Map[String, String]"
  case Some(_) => "Other"
  case None => "Not found"
}

d(Map("id" -> "Hello")) // String.
d(Map("id" -> Map("Hello" -> "World"))) // Map[String, String].
d(Map("id" -> 10)) // Other.
d(Map("id" -> Map(10 -> true))) // Other.
d(Map.empty) // Not found.

注意,只有在调用该方法时 Map 的所有元素都具有相同类型时,这才有效...
如果您首先有 Map[String, Any],这将变得更加复杂 - 德米特里的答案可能会更好。