Возникли проблемы при создании делегата Scala для java.util.Collection # toArray - PullRequest
3 голосов
/ 02 марта 2011

Метод, определенный в Java API:

interface Collection<T> {
  <X> X[] toArray(X[] a);
}

Я пытаюсь сделать что-то подобное в Scala:

class SCollection[T] extends Collection[T] {
    val queue = new LinkedBlockingQueue[T]

    def toArray[X](a: Array[X]) : Array[X] = queue.toArray(a)
}

Я упустил другие методы интерфейса для ясности. Компилятор жалуется на:

overloaded method value toArray with alternatives:
  [T](x$1: Array[T with java.lang.Object])Array[T with java.lang.Object] <and>
  ()Array[java.lang.Object]
 cannot be applied to (Array[X])
  def toArray[X](a: Array[X]) : Array[X] = queue.toArray(a)
                                                 ^

Как мне успешно переопределить метод toArray (..)?

Ответы [ 2 ]

4 голосов
/ 02 марта 2011

Компилятор жалуется, потому что вы должны убедиться, что вы не передаете примитивные массивы, например, Array[Int] (который сопоставляется с int[] в Java).

Вы можете написать свой метод следующим образом:

   override def toArray[X](a: Array[X with AnyRef]) = queue.toArray[X](a)
1 голос
/ 02 марта 2011

Массивы являются единственным типом «коллекции» в jvm, поэтому для построения массива вам необходимо знать точный тип во время выполнения. Это не так легко сделать после стирания ...

Если вы посмотрите, как toArray реализован в коллекциях Scala, вы увидите, что он использует Manifest для восстановления информации о стертых типах. Вам в основном нужно продублировать это и убедиться, что манифест доступен для вашего типа T.

Однако, почему вы реализуете этот класс в первую очередь? Если вы пытаетесь создать собственный класс коллекции, вы обнаружите, что очень быстро становится очень сложно добавить такие функции, как CanBuildFrom. Если вы просто хотите, чтобы оболочка предлагала java Collection для какой-либо другой библиотеки, я бы порекомендовал JavaConvertors. Если вам не нужно взаимодействие, тогда нет никакой причины вообще реализовывать Collection, поскольку Scala имеет отличную структуру коллекций и, как правило, избегает коллекций Java, которые ломаются для использования в полностью функциональном безопасном программировании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...