在scala中,如何取消打包数字类型的不同Java包装器

时间:2016-02-24 05:50:02

标签: scala apache-spark

我正在使用Apache Spark SQL的SqlParser.parseExpression函数来读取复杂的值&字符串中的表达式。 解析器工作正常,但我只有一个问题:所有数值计算结果都是盒装的(作为java.lang.Number的子类),并且它们不能被类型转换为任何其他兼容的数字类型(例如java.lang.Double不能转换为Int),因为类型转换参数是动态生成的,我必须分别为每个盒装类型的unbox写一个很长的模式匹配,是否有一个简短的函数可以用来自动取消打包任何盒装数字?

1 个答案:

答案 0 :(得分:0)

对于每种基本数字类型,

java.lang.Number都有intValue()doubleValue()等方法。

您可以通过调用Number方法来检索intValue()的整数值,而不是模式匹配或转换。

如果您真的想使用模式匹配,那么您可以使用以下内容:

val x: java.lang.Number = new java.lang.Double(5)
(x: Any) match {
  case d: Double => "this is a double"
  case i: Int => "this is an int"
  case _ => "this is something else"
}
// returns "this is a double"

这样的模式匹配仍然很长,但是您可以检查SqlParser.parseExpression的de文档(或源代码)以查看它可能返回的数字类型(例如,它可能只返回Double和Long)。