我如何在 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
括起来以解决此问题)。
我有一段这样的代码:
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
括起来以解决此问题)。