Scala泛型和数字含义
发布时间:2020-12-16 08:57:07 所属栏目:安全 来源:网络整理
导读:我需要将两个函数作为参数传递给 scala函数.然后,该函数应对它们进行评估并从中获取一个数字,然后对其进行操作.此数字可以是Int,Double或任何其他数字类型.无论它使用什么类型,我希望该功能可以工作. 下面的例子解释了这个问题. import Numeric.Implicits._c
我需要将两个函数作为参数传递给
scala函数.然后,该函数应对它们进行评估并从中获取一个数字,然后对其进行操作.此数字可以是Int,Double或任何其他数字类型.无论它使用什么类型,我希望该功能可以工作.
下面的例子解释了这个问题. import Numeric.Implicits._ class Arithmetic[T : Numeric](val A: Connector[T],val B: Connector[T]) { val sum = new Connector({ A.value + B.value }) } class Constant[T](var x: T) { val value = new Connector({ x }) } class Connector[T](f: => T) { def value: T = f override def toString = value.toString() } object Main extends App{ val n1 = new Constant(1) // works val n5 = new Constant(5) val a = new Arithmetic( n1.value,n5.value ) println(a.sum) // no works val n55 = new Constant(5.5) val b = new Arithmetic( n1.value,n55.value ) println(b.sum) } 我也试过了 class Arithmetic[T,R : Numeric](val A: Connector[T],val B: Connector[R]) { 和其他几个组合,但我结束了 error: could not find implicit value for parameter num: scala.math.Numeric[Any] val sum = new Connector({ A.value + B.value }) 解决方法
您看到的错误消息是因为Numeric [T] .plus只能用于添加两个相同类型的值T.
您的代码是在假设数字扩展自动发生的情况下编写的 – 在这种情况下不会,因为编译器除了存在Numeric [T]实例之外不知道任何类型. 如果你需要sum是一个稳定的值,你必须在构造函数中提供必要的类型信息,如下所示: class Arithmetic[A : Numeric,R <% A,S <% A](val a: Connector[R],b: Connector[S]) { val sum = new Connector[A]((a.value:A) + (b.value:A)) } 这要求类型R和S可转换为某些已知数字[A]的A类型. 如果你不需要求和,你可以改变你的类: class Arithmetic[A,B](val a: Connector[A],val b: Connector[B]) { // if A and B are the same types def sum(implicit e: B =:= A,n: Numeric[A]): Connector[A] = new Connector(n.plus(a.value,b.value)) // else widen to C def wideSum[C](implicit f: A => C,g: B => C,n: Numeric[C]) = new Connector(n.plus(a.value,b.value)) } val a = new Connector(1) val b = new Connector(2) val c = new Connector(3.0) val d = (new Arithmetic(a,b)).sum // val e = (new Arithmetic(b,c)).sum // <-- does not compile val e = (new Arithmetic(b,c)).wideSum[Double] 扩展时,您仍然需要提供类型信息. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |