我正在尝试使用映射复制泛型类型的数组。
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
}
试试看!
我希望这能有所帮助。