Scala中带有类对象的Case Switch语句

时间:2019-02-15 19:48:00

标签: scala reflection pattern-matching type-erasure

我正在尝试在Scala中使用大小写转换语句来检查Java Class对象表示的类/类型。我无法传递实际的对象,但是我可以获取该类,并且需要根据该类对象执行不同的逻辑。例如,

def foo(classObj: Class[_]): Any = {
  classObj match {
    case map: Map[String, String] => doMapThings()
    case str: String => doStringThings()
  }
}

但是,这实际上不起作用,因为case语句正在查看Class的类型,即Class,永远不会是Map或String。如何获得classObj表示的类型/类并与此进行匹配?

1 个答案:

答案 0 :(得分:3)

为什么不简单地做显而易见的事情:

def foo(c: Class[_]): Unit = {
  if (c == classOf[Map[_, _]]) println("do Map things") 
  else if (c == classOf[String]) println("do string things") 
  else println("do sth. else") }
}

您可以使用match-guards将其重写为if表达式:

c match {
  case x if x == classOf[Map[_, _]] => ... 
  ...
}

,但这似乎更短或更清晰。另请注意:由于类型擦除,您在运行时无法区分Map[Int, Double]Map[String, String]