java - JsValue 中的 Scala 模式匹配类型

标签 java scala generics playframework pattern-matching

所以我在 Scala 中有这两个类似的函数,它们都将 JsValue 转换为 Java 类型的 Number,并且实际上仅在特定类型上有所不同:

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 中的类型进行模式匹配,这样我就知道我想要什么类型返回。

最佳答案

有些关闭怎么样?

  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)

关于java - JsValue 中的 Scala 模式匹配类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45364415/

相关文章:

java - 检索数组中的子文档作为 DBObject(s)

Scala 优雅的列表理解,如 F#

scala - 如何在 Scala 中为表达式注释表达式类型

scala - 从 Spark 中的 Google 存储桶中读取文件

c# - 如何实例化具有多个输入参数的泛型类型?

java - 从 Activity 移动到上一个 fragment

java - 保存 Activity 或服务中未处理的异常而不崩溃

java - 用Java填充二维数组

java - 使用对象作为无界通配符引用对象的参数

c# - 效率 : Func<T>, 与 T 的实例