我如何在scala

时间:2016-12-19 23:24:10

标签: scala json4s

我有一段这样的代码:

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类型,我们希望以特殊方式处理空字符串。

2 个答案:

答案 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。)