gpt4 book ai didi

scala - 类型参数化和奇怪的转换异常

转载 作者:行者123 更新时间:2023-12-02 01:33:26 24 4
gpt4 key购买 nike

我有以下代码,它在满足谓词 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。

最佳答案

看起来实例化嵌套数组会导致错误 - 即使在这么小的例子中它也会崩溃:

def instantiate[A](ununsed_arg: Array[T])(implicit tag: ClassTag[A]) =
Array[Array[A]](Array.empty[A])

作为快速解决方法,您可以使用 ArrayBuilder 来创建数组:

def instantiate[T](a: Array[T])(implicit ctc: ClassTag[T]) = {
val builder = ArrayBuilder.make[Array[T]]
builder += Array.empty[T]
builder.result
}

另请注意,您的代码段直接将元素附加到数组,这是一个坏主意,因为它必须创建一个带有多个槽的新数组并复制一个元素。看起来您应该使用 ArrayBuilderArrayBuffer 进行处理,或者从列表中构建新的数据结构并将它们转换为 Arrays结束。

关于scala - 类型参数化和奇怪的转换异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32787989/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com