【问题标题】:Scala pattern match types within JsValueJsValue 中的 Scala 模式匹配类型
【发布时间】: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


【解决方案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)

【讨论】:

    猜你喜欢
    • 2020-08-09
    • 1970-01-01
    • 2013-03-17
    • 2014-03-05
    • 2017-08-18
    • 2011-08-11
    • 2018-11-26
    • 1970-01-01
    相关资源
    最近更新 更多