使用map创建数组(具有泛型类型)的副本会导致错误[Scala]



我正在尝试使用映射复制泛型类型的数组。

class MaObj[T](val arr : Array[T])(implicit ordering : Ordering[T]) {
  val internalCopy : Array[T] = arr.map(e => e) //This line

但我运行它会出现一个错误,说

found   : scala.collection.mutable.ArraySeq[T]
 required: Array[T]
 Note: implicit value comparison is not applicable here because it comes after the application point and it lacks an explicit result type
val internalCopy : Array[T] = arr.map(e => e)

我无法理解这一点。

因此,问题是当在编译时没有数组元素的类型信息时,.map返回ArraySeq而不是Array。这是因为您需要元素的实际类:Array.newInstance(clazz, numElements)。当您仅将元素类型指定为T时,这是不可用的,所以当您执行.map时,它会将容器类型切换为ArraySeq以绕过该限制。

一种方法是将班级信息传递给你的班级:

class MaObj[T : ClassTag : Ordering](val arr : Array[T])

(这相当于class MaObj[T](val arr: Array[T])(implicit ev1: ClassTag[T], ev2: Ordering[T])

这将一个隐式参数传递给类,使其能够在运行时解析元素类型。

另一种方法是,如果你真的只想复制数组而不想转换它的元素,你可以使用.clone,正如另一个答案所建议的那样。它的效率也高得多。

或者一开始就用IndexedSeq而不是Array,反正更好。

您可以使用.clone轻松复制Array,而不用将.map的方法与身份相结合。

你的代码看起来是这样的:

class MaObj[T](val arr : Array[T])(implicit ordering : Ordering[T]) {
  val internalCopy: Array[T] = arr.clone
}

试试看!

我希望这能有所帮助。

相关内容

  • 没有找到相关文章

最新更新