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