我试图为数值定义一个通用的添加函数:
def add[A](x:A, y:A): A = {
x + y
}
console:16:错误:类型不匹配;
找一个
必需:字符串
x + y
^
编译器抱怨什么? 我现在用谷歌搜索的一些内容对我来说并没有多大意义。
答案 0 :(得分:10)
由于您定义A
没有边界且没有额外信息,它可能是任何类型,而且任何Scala类型都没有+
方法 - 所以这可以&# 39; t compile。
错误消息是编译器尝试隐式地将 x
转换为String的结果(因为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)
}
答案 1 :(得分:2)
为了能够做这样的事情,编译器需要知道A
有一个方法
def +(a: A): A
理想情况下,您可能希望执行类似
的操作def add[A :< Numeric](x:A, y:A): A = { ...
但你不能,因为Scala中的数字类型没有常见的超类型(它们扩展AnyVal
)。查看here以获取相关问题。