在Java中,我可以像这样使用数字
public void myFunction(Number number) {
double innerVar = 1.0; //initial value
if (number != null) {
innerVar += number.doubleValue();
}
//do other logic
}
如果我需要使用Integer
我可以用intValue
替换doubleValue
代码。
但是scala.math.Numeric 没有这样的方法,只有像toDouble(x:T)
我不知道这里的参数是什么x:T
。另外,如果您看到scala.Double
或 scala.Short
他们有方法toDouble
但这些方法不是从一个特征继承而来的。
我可以使用模式匹配,但是toDouble
有很多代码重复:
val myNum:AnyVal = ...
var innerDouble = 1.0
myNum match {
case Double => innerDouble + myNum
case Short => innerDouble.toDouble + myNum
case Int => innerDouble.toDouble + myNum
}
或其他变体
val myNum:AnyVal = ...
var innerDouble = 1.0
myNum match {
case Double | Short | Int | Long => innerDouble.toDouble + myNum
case _ =>
}
那么,如何有更好的方法来使用 Scala 处理数值类型呢?
附言
我像<% double
一样阅读了 scala 中的视图边界,但不知道如何将它们用于模式匹配。
更新
这是类似的问题,但它是关于其中的类和参数,我需要用于模式匹配的解决方案。
一种可能的解决方法,Numeric
类型类的脏替代方案,是获取myNum
的字符串表示形式并使用String.toDouble
解析它:
val myNum:AnyVal = ...
var innerDouble = 1.0
val res = myNum.toString.toDouble + innerDouble
如果myNum
不包含可解析为双精度值,则分析步骤将引发NumberFormatException
它不优雅,但代码很短。
综上所述,您可以使用Numeric
:
def myFunction[T : Numeric](number: T) = {
var innerVar = 1.0;
innerVar = implicitly[Numeric[T]].toDouble(number) + innerVar;
innerVar
}
或者利用字符串解析:
def myFunction(number: AnyVal) = {
var innerVar = 1.0;
innerVar = number.toString.toDouble + innerVar;
innerVar
}
作为形式上更丑陋的第二种选择,它允许number
的实际参数,例如 "3.3"
.