Scala中嵌套数组上的模式匹配

时间:2017-07-12 09:44:47

标签: scala types pattern-matching

我想创建Any类型的数组,如下所示:

val arr: Array[Any] = Array(Array(1, 2, Array(3)), 4)

然后我想用这段代码使用尾递归来展平它:

def flatten(xs: Array[Any]): Array[Any] = {

    @tailrec
    def makeFlat(xs: List[Any], res: List[Any]): List[Any] = xs match {
      case Nil => res
      case head :: tail => head match {
        case h: Array[Any] => makeFlat(h.toList ::: tail, res)
        case _ => makeFlat(tail, res :+ head)
      }
    }

    makeFlat(xs.toList, Nil).toArray
}  

我使用的是Scala 2.12版本。

当迭代从源数组进入内部数组Array(3)时,模式匹配case h: Array[Any]不起作用。这很奇怪,因为Int扩展了Any。我试图调试并意识到这个数组是int[1](原始int数组)。

为什么scala决定将它作为原始数组,以及如何弄清楚这种情况?

2 个答案:

答案 0 :(得分:5)

它不起作用,因为你不会让它推断出类型。

case h: Array[Any]替换为case h: Array[_],您就是黄金。

答案 1 :(得分:0)

Array是一个java类,而不是scala类

它不支持差异

请参阅http://docs.scala-lang.org/tutorials/tour/variances.html