所以我在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
中的类型,所以我知道我想要返回的类型。
答案 0 :(得分:1)
一些封闭怎么办?
def getNumber[T](jsNumber : JsValue)(f : String => T) : T = {
val strNumber: String = jsNumber.asInstanceOf[JsString].value.replace(",", "")
f(strNumber)
}
def getDouble(jsDouble: JsValue): JavaDouble = {
getNumber(jsDouble)(JavaDouble.valueOf)
}
def getInteger(jsInteger: JsValue): JavaInteger = {
getNumber(jsInteger)(JavaInteger.valueOf)
}
请注意,此时语法def getDouble = getNumber(_)(JavaDouble.valueOf)
也有效,但我不太确定它是否真的相同(或者更确切地说,我确定它不是,但我不确定原因:D )