Case Switch语句在Scala中使用类对象



我正在尝试使用scala中的案例开关语句检查哪个类/键入Java Class对象表示。我无法通过实际的对象,但是我可以获得课程,并且需要根据该类对象执行不同的逻辑。例如,

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

但是,这并不能真正起作用,因为案例语句正在查看类的类型,即类型,永远不会是映射或字符串。如何获得classObj代表和匹配的类型/类?

为什么不简单地做明显的:

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") }
}

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

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

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

最新更新