在尝试使用类型变量时,我尝试使用代码并且失败了(尝试编写可以添加任意两种数据类型的通用代码)。
让我感到惊讶的是这个错误。为什么编译器抱怨它需要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
答案 0 :(得分:3)
由于A
不受任何限制,因此它可以是任何类型。具体来说,该类型不一定具有+
方法(您尝试在方法体中调用)。然后,编译器尝试找到一些隐式转换,它可能会使用x
方法将+
转换为某种类型,并且会发现this隐式转换为{{1}来自String
:
Predef.scala
因此,方法体等同于:
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.+
不是String。
修改强>:
要创建“通用”添加功能,必须以确保可以添加的方式绑定类型y
。一种方法是使用A
类型:
Numeric
这意味着可以为任何隐式def add[A : Numeric](x:A, y:A) = { implicitly[Numeric[A]].plus(x, y) }
存在的A
类型调用您的函数。