Java 如何使用数字scala类型?
在Java中,我可以像这样工作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
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
实际上是在约束属性的类型。