gpt4 book ai didi

scala - Scala 中二维数组的类型不匹配错误

转载 作者:行者123 更新时间:2023-12-01 11:38:50 25 4
gpt4 key购买 nike

我在 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))

这是错误信息:

enter image description here

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

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

为什么会出现这个错误,如何解决这个问题?

最佳答案

令人惊讶的是,Array 不是Sequence,至少通过@Brian 指出的通常的继承方式是这样。但除此之外 -- 问题的出现是因为您使用了 嵌套数组 并且因为 隐式转换的工作方式 在 Scala 中。

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

enter image description here

因此此修复尝试失败,最终编译器因该错误而退出:Type mismatch, blah blah blah。正如您可能已经猜到的那样,implicit conversions do not go into depth (实际上这是理智的规则)。但是,在这个例子中,scalac 会愉快地进行类型检查并编译这样的代码:

def foo(seq: Seq[Array[Int]]) = println(seq)
foo(Array(Array(1)))
// WrappedArray([I@afb9176)

遗憾的是,最初的解决方案是使用 Seqs,因为我认为手动转换封闭数组对您来说不是一个可行的选择。

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

关于scala - Scala 中二维数组的类型不匹配错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24020113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com