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

时间:2016-10-28 11:28:05

标签: scala types

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

让我感到惊讶的是这个错误。为什么编译器抱怨它需要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

1 个答案:

答案 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类型调用您的函数。