Использование карты для создания копии массива (с универсальным типом) приводит к ошибке [Scala] - PullRequest
0 голосов
/ 15 ноября 2018

Я пытаюсь скопировать массив универсального типа, используя карты.

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)

Я не могу понять это.

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Итак, проблема в том, что .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, лучше в любом случае.

0 голосов
/ 15 ноября 2018

Вместо использования вашего подхода .map в сочетании с удостоверением, вы можете легко скопировать Array, используя .clone.

Ваш код будет выглядеть так:

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

  val internalCopy: Array[T] = arr.clone

}

Попробуйте!

Надеюсь, это поможет.

...