3
我有下面的代碼,在滿足謂詞p
的任何元素之前,將數組拆分成數組數組。它的類型檢查:類型參數化和奇怪的轉換異常
def splitBefore[T](a: Array[T], p: (T) => Boolean)
(implicit tct: ClassTag[T]): Array[Array[T]] =
a.foldLeft(Array[Array[T]](Array.empty[T])) {
(acc: Array[Array[T]], s: T) => if (p(s))
acc :+ Array(s)
else
acc.init :+ (acc.last :+ s)
}
它正常工作時,我把它與非空a
:
scala> splitBefore(Array("a", "BC", "d"), (s: String) => s.size > 1)
res1: Array[Array[String]] = Array(Array(a), Array(BC, d))
但是,當我用一個空數組調用它,我得到了ClassCastException
:
scala> splitBefore(Array.empty[String], (s: String) => s.size > 1)
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [[Ljava.lang.String;
... 33 elided
當我手動內聯呼叫,所以沒有類型參數化,它工作正常:
scala> Array().foldLeft(Array(Array.empty[String])) {
| (acc: Array[Array[String]], s: String) => if (s.size > 1)
| acc :+ Array(s)
| else
| acc.init :+ (acc.last :+ s)
| }
res1: Array[Array[String]] = Array(Array())
任何想法這裏發生了什麼?我正在使用Scala 2.11.7。
我想說這是一個錯誤。生成的字節碼顯然是錯誤的。 – ghik