Scala Numeric init,常量为0

que*_*sam 6 scala numeric

让我有一个名为MathUtil的实用程序类.

它看起来像这样.

abstract class MathUtil(T:Numeric){
   def nextNumber(value:T)
   def result():T
}
Run Code Online (Sandbox Code Playgroud)

让我以这种方式对它进行子类化

class SumUtil[T:Numeric] extends MathUtil[T]{
   private var sum:T = 0
   override def nextNumber(value:T){
     sum = sum + value
   }
   override def result():T = sum
}
Run Code Online (Sandbox Code Playgroud)

我的陈述有问题

private var sum:T = 0
Run Code Online (Sandbox Code Playgroud)

现在,我必须初始化为总和0.我猜任何数字都有办法表示0.我对scala很新.我该如何解决这个问题?

Tra*_*own 11

Numeric类型的类的实例zero,你想要什么样的方法:

class SumUtil[T: Numeric] extends MathUtil[T] {
   private var sum: T = implicitly[Numeric[T]].zero
   override def nextNumber(value: T) {
     sum = implicitly[Numeric[T]].plus(sum, value)
   }
   override def result(): T = sum
}
Run Code Online (Sandbox Code Playgroud)

请注意,您还需要该plus方法的实例,除非您导入Numeric.Implicits._,在这种情况下您可以使用+.在这种情况下,您也可以通过不使用上下文绑定语法来清理代码:

class SumUtil[T](implicit ev: Numeric[T]) extends MathUtil[T] {
   import Numeric.Implicits._
   private var sum: T = ev.zero
   override def nextNumber(value: T) {
     sum = sum + value
   }
   override def result(): T = sum
}
Run Code Online (Sandbox Code Playgroud)

这完全等价:上下文绑定版本只是这个隐式参数的语法糖,但是如果你需要明确地使用那个参数(正如你在这里做的那样zero),我发现编写desugared版本更清晰.