为什么以下scala实验代码不起作用?

use*_*899 3 functional-programming scala

我正在尝试为数值定义一个通用的添加函数:

def add[A](x:A, y:A): A = {
  x + y
}
Run Code Online (Sandbox Code Playgroud)


console:16:错误:类型不匹配; found:A required:String x + y ^

什么是编译器抱怨?我用谷歌搜索的一些东西在这一刻对我来说并没有多大意义.

Tza*_*har 10

由于您A没有边界定义,也没有额外信息,因此它可以是任何类型,并且任何Scala类型都没有+方法 - 因此无法编译.

错误消息是编译器尝试隐式转换 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)
Run Code Online (Sandbox Code Playgroud)

编辑:或等效的语法:

def add[A: Numeric](x:A, y:A): A = {
  implicitly[Numeric[A]].plus(x, y)
}
Run Code Online (Sandbox Code Playgroud)