Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.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中2D数组的类型不匹配错误_Scala_Scala Collections - Fatal编程技术网

Scala中2D数组的类型不匹配错误

Scala中2D数组的类型不匹配错误,scala,scala-collections,Scala,Scala Collections,我在Scala的函数参数中定义了Seq[Seq[Byte]]类型 def checkAllZeroElementsInTable(table: Seq[Seq[Byte]]) : Boolean = { ... 当我给出一个类型为Array[Array[Byte]]的参数时,我得到了类型不匹配错误 val table = Array(Array[Byte](0,0,0),Array[Byte](0,0,0),Array[Byte](0,0,0),Array[Byte](0,0,1)) 这是错

我在Scala的函数参数中定义了
Seq[Seq[Byte]]
类型

def checkAllZeroElementsInTable(table: Seq[Seq[Byte]]) : Boolean = {
...
当我给出一个类型为
Array[Array[Byte]]
的参数时,我得到了类型不匹配错误

val table = Array(Array[Byte](0,0,0),Array[Byte](0,0,0),Array[Byte](0,0,0),Array[Byte](0,0,1))
这是错误消息:

最简单的解决方案是重新定义函数,但我认为这不是最好的解决方案

def checkAllZeroElementsInTable(table: Array[Array[Byte]]) : Boolean = {
...

为什么会出现此错误,以及如何解决此问题?

此错误是因为
数组
不是
Seq
类型<代码>数组是Scala对Java数组的表示

Array
的类型层次结构显示它不是从
Seq
继承的,正如错误消息所说


您可以将函数更改为按您所注意的那样获取一个
数组
。如果需要可变集合,请查看
scala.collection.mutable.ArrayBuffer
。对于不可变集合,还有其他选项,最佳选择取决于算法访问集合的方式。这在集合特性方面有很好的信息:

令人惊讶的是,数组不是一个序列,至少通过@Brian指出的通常继承方式是这样的。但除此之外,问题的出现是因为您使用了嵌套数组,以及在scala中隐式转换的工作方式

首先,编译器遍历您的所有代码,并愉快地移动位和螺栓。现在,如果存在类型检查错误,它将查找允许执行的隐式转换列表,以修复其他不可编译的代码(其中一个是
Array=>Seq
)。因此,编译器在左侧看到
Seq[Seq[Byte]]
,并尝试应用该转换。在这种应用之后,右边有什么?对,它得到的是
Seq[Array[Byte]]
,而不是
Seq[Seq[Byte]]

因此,此修复尝试失败,最终编译器会因该错误退出:
类型不匹配,诸如此类。正如你可能已经猜到的,(实际上这是一条明智的规则)。但是,在本例中,scalac将乐于进行类型检查并编译这样的代码:

def foo(seq: Seq[Array[Int]]) = println(seq)
foo(Array(Array(1)))
// WrappedArray([I@afb9176)
遗憾的是,解决方案是最初使用Seqs,因为我认为手动转换封闭阵列对您来说不是一个可行的选择

编辑:事实上,它也失败了,因为没有隐式转换,而隐式转换的目的是转换集合的元素,但是如果您要引入一个隐式转换,您将被上面解释的机制阻止(但是,它可以通过额外的麻烦来解决)

我建议使用,如类似问题中所示。