2017-07-12 14 views
2

我想創建Any類型,它看起來像的數組:圖案上嵌套數組匹配Scala中

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

Scala的推斷陣列(3)爲ARRAY [INT]的類型,因爲你只在其中存儲一個Int。您的Array [Any]類型僅指頂層數組。 val arr:Array [Any] = Array(Array(1,2,Array [Any](3)),4)將爲Array(3)創建一個Array [Any]。 – sheunis

回答

5

它不工作,因爲你不讓它推斷類型。

case h: Array[_]替換case h: Array[Any],你是金。

0

Array是Java類,不階類

它不支持方差

參見http://docs.scala-lang.org/tutorials/tour/variances.html

+0

真的嗎?但是我在scala文檔中讀到了'Array'類。請檢查這個鏈接http://www.scala-lang.org/api/2.12.1/scala/Array.html。 – eg04lt3r

+1

其運行時類是java類,所有額外的成員函數在編譯時被轉換。最重要的是,它被定義爲'Array [T]'而不是'Array [+ T]' –