使用 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
}
希望对您有所帮助。
所以,问题是 .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
,这样更好。
我正在尝试使用映射复制泛型数组。
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
}
希望对您有所帮助。
所以,问题是 .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
,这样更好。