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

Using map to create a copy of an array (with generic type) results in error [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)

我无法理解这一点。

您可以使用 .clone.

轻松复制 Array,而不是使用 .map 结合身份的方法

您的代码如下所示:

class MaObj[T](val arr : Array[T])(implicit ordering : Ordering[T]) {

  val internalCopy: Array[T] = arr.clone

}

Try it out!

希望对您有所帮助。

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

一种解决方法是将 class 信息传递给您的 class:

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

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

这将一个隐式参数传递给 class,让它在 运行 时解析元素类型。

另一种方式,如果你真的只想复制数组而不转换它的元素,你可以只使用 .clone,正如其他答案所暗示的那样。它也更有效率。

或者一开始就用IndexedSeq代替Array,这样更好。