我有一段这样的代码:
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对象获取Option值
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
}
}
我的想法是,我想要对其进行填充,以便仅对该方法的String类型,我们希望以特殊方式处理空字符串。
答案 0 :(得分:6)
您可以在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)
}
}
答案 1 :(得分:1)
一个常见的技巧是将要比较的值放入局部变量或字段中:
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
。)