我想创建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决定将它作为原始数组,以及如何弄清楚这种情况?
答案 0 :(得分:5)
它不起作用,因为你不会让它推断出类型。
将case h: Array[Any]
替换为case h: Array[_]
,您就是黄金。
答案 1 :(得分:0)