让我有一个名为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版本更清晰.