在尝试使用类型变量时,我尝试了以下代码,但失败了(试图编写可以添加任意两种数据类型的泛型代码)。
使我吃惊的是这个错误。为什么编译器抱怨它需要一个String数据类型?我没有在代码中提到Stringscala> 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]
存在