我正在尝试在scala中实现支持加法和乘法的通用数字,可以模式匹配任何数字,并且不限于任何一种类型,如Int
,Double
等。查找文档并发现java.lang.Number
符合最后一个条件,即与java.lang.Number
次匹配的任何数字模式。所以我很快写了这个实现:
case class Number(num: java.lang.Number) {
def +(that: Number) = Number(this.num + that.num)
def *(that: Number) = Number(this.num * that.num)
}
但事实证明,java.lang.Number
没有方法+
和*
。所以我现在不确定如何实现这一点。一位教授建议调查类型和尖顶库,但我仍然遇到麻烦。
理想情况下,我希望拥有的内容是这样的
Number[A] + Number[A] returns Number[A]
Number[A] + Number[B] return Number[Finest type containing both A and B]
如果有人可以帮我解决这个问题,我会非常感激。谢谢。 :)
答案 0 :(得分:2)
Scala有一个名为Numeric的类型类,其中包含通常的JVM编号类型的实现。
注意:它不满足Number[A] + Number[B]
方案
以下示例
如果您想定义自己的号码类型,例如
case class RationalNumber(numerator: Int, denominator: Int)
然后你还要为它实现一个Numeric
实例
object RationalNumeric extends Numeric[RationalNumber] {
// implement the abstract methods
}
一些scala库方法(例如List' sum:def sum[B >: A](implicit num: Numeric[B]): B
)采用隐式Numeric实例,因此如果引入RationalNumeric
的隐式引用,则可以执行以下操作:
List(RationalNumber(1,2), RationalNumber(2,3)).sum
此外,Numeric
定义了一个隐式升级,将运算符添加到其类中,因此您可以这样做:
import RationalNumeric._
val sum = RationalNumber(1,2) + RationalNumber(2,3)