Scala Numeric init,常量为0
发布时间:2020-12-16 18:54:48 所属栏目:安全 来源:网络整理
导读:让我有一个名为MathUtil的实用程序类. 它看起来像这样. abstract class MathUtil(T:Numeric){ def nextNumber(value:T) def result():T} 让我以这种方式对它进行子类化 class SumUtil[T:Numeric] extends MathUtil[T]{ private var sum:T = 0 override def n
让我有一个名为MathUtil的实用程序类.
它看起来像这样. abstract class MathUtil(T:Numeric){ def nextNumber(value:T) def result():T } 让我以这种方式对它进行子类化 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 } 我的陈述有问题 private var sum:T = 0 现在,我必须初始化为总和0.我猜任何数字都有办法表示0.我对scala很新.我该如何解决这个问题? 解决方法Numeric type class instance有一个零方法,可以做你想要的:
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 } 请注意,除非导入Numeric.Implicits._,否则还需要plus方法的实例,在这种情况下可以使用.在这种情况下,您也可以通过不使用上下文绑定语法来清理代码: 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 } 这完全等价:上下文绑定版本只是这个隐式参数的语法糖,但是如果你需要明确地使用那个参数(正如你在这里做的那样,为零),我发现编写desugared版本更清晰. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |