我如何在 Scala 中在运行时 class 进行模式匹配

how can i pattern match on runtime class in scala

我有一段这样的代码:

override def getOption[T: TypeTag: ClassTag](path: String): Option[T] = {
  implicitly[scala.reflect.ClassTag[T]].toString() match {
    case "java.lang.String" => HandleBlank(super.getOption[String](path)).asInstanceOf[Option[T]]
    case _ => super.getOption[T](path)
  }
}

我想肯定有比按字符串匹配更好的方法来执行此操作,但尝试了一些方法(如 classOf[String])但似乎找不到有效的方法。

对于上下文,getOption(在我们试图覆盖的超类中)从 json4s AST JValue 对象获取选项值

def getOption[T: TypeTag: ClassTag](path: String): Option[T] = Try(getJValue(path).extract[T]).toOption

def getJValue(path: String): JValue = {
  path.split('.').foldLeft(value)((a, b) => a \ b) match {
    case JNull => JNothing
    case j     => j
  }
}

我的想法是,我想对其进行填充,以便仅针对该方法的字符串类型,我们希望以特殊方式处理空白字符串。

您可以像这样在 ClassTag 之间进行直接相等性测试:

override def getOption[T: TypeTag: ClassTag](path: String): Option[T] = {
  // not required, just nicer to write classTag[T] vs. implicitly[ClassTag[T]]
  import reflect.classTag
  classTag[T] match {
    case strTag if strTag == classTag[String] => HandleBlank(super.getOption[String](path)).asInstanceOf[Option[T]]
    case _ => super.getOption[T](path)
  }
}

一个常见的技巧是将要比较的值放入局部变量或字段中:

import scala.reflect.classTag

val StringTag = classTag[String]

override def getOption[T: TypeTag: ClassTag](path: String): Option[T] = {
  classTag[T] match {
    case StringTag => ...
    case _ => ...
  }
}

请注意,名称应以大写字母开头,否则 case stringTag 只会绑定一个新变量(尽管您可以用 ` 将 stringTag 括起来以解决此问题)。