我刚刚开始使用 Scala,而我认为应该很容易理解的东西很难弄清楚。我正在尝试实现以下功能:def square(x:Int):Int = { x * x }
这工作得很好,但如果我想尝试使这个函数适用于任何类型的数字,我希望能够执行以下操作:def square[T <: Number](x : T):T = { x * x }
这提示并说:错误:值*不是类型参数T的成员
我需要为此实现一个特征吗?
最佳答案
那是我的 first questions 之一在 Stack Overflow 或关于 Scala 中。问题在于 Scala 保持与 Java 的兼容性,这意味着它的基本数字类型等同于 Java 的原语。
问题在于Java原语不是类,因此没有允许“数字”父类(super class)型的类层次结构。
说得更清楚一点,Java 以及因此的 Scala 在 Double
之间没有任何共同点。的+
和一个 Int
的+
.
Scala 最终绕过这个限制的方法是使用 Numeric
, 及其子类 Fractional
和 Integral
,在所谓的类型类模式中。基本上,您可以像这样使用它:
def square[T](x: T)(implicit num: Numeric[T]): T = {
import num._
x * x
}
或者,如果您不需要任何数字操作,但您调用的方法需要,您可以使用上下文绑定(bind)语法进行类型声明:
def numberAndSquare[T : Numeric](x: T) = x -> square(x)
有关更多信息,请参阅我自己的问题中的答案。
关于scala - 如何在 Scala 中实现通用数学函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4056452/