【发布时间】:2018-01-03 23:42:04
【问题描述】:
所以我在 Scala 中有这两个类似的函数,它们都将它们的 JsValue 转换为 Java 类型的数字,并且实际上只在特定类型上有所不同:
import play.api.lib.json._
import java.lang.{Double => JavaDouble, Integer => JavaInteger}
def getDouble(jsDouble : JsValue) : JavaDouble = {
val strDouble : String = jsDouble.asInstanceOf[JsString].value.replace(",", "")
val jDouble : JavaDouble = JavaDouble.valueOf(strDouble)
jDouble
}
def getInteger(jsInteger : JsValue) : JavaInteger = {
val strInteger : String = jsInteger.asInstanceOf[JsString].value.replace(",", "")
val jInteger : JavaInteger = JavaInteger.valueOf(strInteger)
jInteger
}
由于它们彼此非常相似,我希望将它们组合成一个函数,并使用泛型类型来区分两者并按类型进行模式匹配:
def getNumber[T](jsNumber : JsValue) : T = {
val strNumber: String = jsNumber.asInstanceOf[JsString].value.replace(",", "")
T.valueOf(strNumber) match {
case typeOf[JavaInteger] => JavaInteger.valueOf(strNumber)
case typeOf[JavaDouble] => JavaDouble.valueOf(strNumber)
// case _ => throw a relevant Exception
}
}
但是T.valueOf 实际上不起作用,我希望有某种方法可以模式匹配JsValue 中的类型,这样我就知道我想要返回什么类型。
【问题讨论】:
-
你的
jsDouble : JsValue是什么样的??奇怪的是您正在转换为字符串并删除","-jsDouble.asInstanceOf[JsString].value.replace(",", "")。你的 jsValue 不应该像JsNumber(50.8)或JsNumber(50) -
1000以上时,值中有逗号。
标签: java scala generics playframework pattern-matching