我正在尝试定义一个通用的加法函数,用于数字数值:
def add[A](x:A, y:A): A = {
x + y
}
控制台:16:错误:类型不匹配;
发现:A
需要:String
x + y
^
编译器在抱怨什么? 我在谷歌上搜索到的一些内容目前并不太让我理解。
def add[A](x:A, y:A): A = {
x + y
}
控制台:16:错误:类型不匹配;
发现:A
需要:String
x + y
^
编译器在抱怨什么? 我在谷歌上搜索到的一些内容目前并不太让我理解。
A
时没有指定边界和额外信息,它可以是任何类型。然而,并非所有的Scala类型都具有+
方法,所以无法编译。x
隐式转换为字符串(因为String具有+
方法,并且每种类型都可以使用toString
转换为字符串)导致的,但失败了,因为y
不是一个字符串。Numeric
类型:def add[A](x:A, y:A)(implicit n: Numeric[A]): A = {
n.plus(x, y)
}
add(1, 3)
add(1.4, 3.5)
编辑:或者等价的语法:
def add[A: Numeric](x:A, y:A): A = {
implicitly[Numeric[A]].plus(x, y)
}
A
有一个方法。def +(a: A): A
def add[A :< Numeric](x:A, y:A): A = { ...
但是你不能这样做,因为在Scala中的数字类型没有共同的超类型(它们扩展AnyVal
)。这里有一个相关的问题,请点击这里。
+
方法。 - Jörg W Mittag