Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Scala中解释此错误(类型参数)_Scala_Types - Fatal编程技术网

在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]
存在。

非常好的解释!!非常好的解释!!