在Scala中解释这个错误(类型参数)



在尝试使用类型变量时,我尝试了以下代码,但失败了(试图编写可以添加任意两种数据类型的泛型代码)。

使我吃惊的是这个错误。为什么编译器抱怨它需要一个String数据类型?我没有在代码中提到String
scala> def add[A](x:A, y:A) = {x+y}
<console>:16: error: type mismatch;
 found   : A
 required: String
       def add[A](x:A, y:A) = {x+y

由于A不受任何约束,因此它可以是任何类型。具体来说,该类型不一定具有+方法(您可以尝试在方法体中调用该方法)。然后,编译器试图找到一些隐式转换,这些隐式转换可能会用+方法将x转换为某种类型,并且它发现从Predef.scala隐式转换为String:

implicit final class any2stringadd[A](private val self: A) extends AnyVal {
  def +(other: String): String = String.valueOf(self) + other
}

那么,方法体就等价于:

String.valueOf(x).+(y)

但是编译器失败,因为String.+需要一个String参数,而y不是一个String参数。

编辑:要创建一个"泛型"加法函数,必须以一种确保它可以被添加的方式绑定类型A。一种方法是使用Numeric类型:

def add[A : Numeric](x:A, y:A) = { implicitly[Numeric[A]].plus(x, y) }

这意味着你的函数可以被任何类型的A调用,其中隐式Numeric[A]存在

最新更新