如何使用数字缩放类型



在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.Doublescala.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" .

最新更新