在Scala中解释此错误(类型参数)
在试验类型变量时,我尝试了以下代码,但失败了(尝试编写一个可以添加任意两种数据类型的通用代码) 使我吃惊的是错误。为什么编译器抱怨它需要字符串数据类型?我在代码中没有提到字符串在Scala中解释此错误(类型参数),scala,types,Scala,Types,在试验类型变量时,我尝试了以下代码,但失败了(尝试编写一个可以添加任意两种数据类型的通用代码) 使我吃惊的是错误。为什么编译器抱怨它需要字符串数据类型?我在代码中没有提到字符串 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 scala>defadd[
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
scala>defadd[A](x:A,y:A)={x+y}
:16:错误:类型不匹配;
发现:A
必需:字符串
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)
但是-compiler失败了,因为String.+
需要一个字符串参数,而y
不是字符串
编辑:
要创建“通用”添加函数,必须以确保可以添加的方式绑定类型a
。一种方法是使用数值类型:
def add[A : Numeric](x:A, y:A) = { implicitly[Numeric[A]].plus(x, y) }
这意味着您的函数可以为任何类型的A
调用,其中隐式数值[A]
存在。由于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)
但是-compiler失败了,因为String.+
需要一个字符串参数,而y
不是字符串
编辑:
要创建“通用”添加函数,必须以确保可以添加的方式绑定类型a
。一种方法是使用数值类型:
def add[A : Numeric](x:A, y:A) = { implicitly[Numeric[A]].plus(x, y) }
这意味着您的函数可以被任何类型的A
调用,其中隐式Numeric[A]
存在。非常好的解释!!非常好的解释!!