Java 如何使用数字scala类型?

Java 如何使用数字scala类型?,java,scala,numbers,numeric,Java,Scala,Numbers,Numeric,在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.mat

在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

val res = myNum.toString.toDouble + innerDouble
或其他变体

val myNum:AnyVal = ...
var innerDouble = 1.0
myNum match {
    case Double | Short | Int | Long => innerDouble.toDouble + myNum
    case _ =>
}
那么,如何更好地使用Scala处理数字类型呢

p.S.


我读过scala中的视图边界,比如
一个可能的解决方法,是
Numeric
类型类的一个肮脏的替代方法,就是获取
myNum
的字符串表示形式,并使用
string对其进行解析。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

val res = myNum.toString.toDouble + innerDouble
如果
myNum
不包含可解析为双精度的值,则解析步骤将抛出
NumberFormatException

它并不优雅,但代码很短

总之,您可以使用
数值

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”

请在此处检查另一个问题:已检查,但不了解如何在模式匹配中使用它:(@Cherry使用
Numeric
的意义在于,您不需要使用模式匹配将
myNum
添加到
innerDouble
。是的,但在我的情况下,我需要确保只有“Number”支持
toDouble
(例如,所有scala类型都是double视图),而是使用隐式的(据我所知)任何人都可以使用double编写隐式转换,代码也可以使用该类型,但我不需要这种行为。例如,使用double视图的目标并不是每个类都有隐式转换。@Cherry在@anquegi链接的答案和我在我的文章中发布的示例中,隐式的不是转换(从
AnyVal
Double
)但提供转换的对象。假定仅当此对象的类型为
数值[T]时,才会解析隐式值
并且对于
T
s,只有这样的隐式对象支持
toDouble
实际上是在约束属性的类型。