Слегка модифицировано от ответа Дмитрия.Этот фрагмент кода использует TypeTag
до Overcome стирание типа .
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[String, Any]
, во-первых, это становится более сложным - и, вероятно, Дмитрий будет лучше.