Создание типизированной коллекции

Я пытаюсь понять коллекции Scala, добавляя новую коллекцию следующим образом:

class NewColl[V](values:Vector[V],someOtherParams)
extends IndexedSeq[V] with IndexedSeqLike[V, NewColl[V]] {

  def fromSeq[V](seq: Seq[V]): NewColl[V] = ...

  override def newBuilder[V]: Builder[V, NewColl[V]] =
    new ArrayBuffer[V] mapResult fromSeq[V]
}

но я получаю следующую ошибку:

overriding method newBuilder in trait TraversableLike
   of type => scala.collection.mutable.Builder[V,NewColl[V]];
method newBuilder in trait GenericTraversableTemplate
   of type => scala.collection.mutable.Builder[V,IndexedSeq[V]] has incompatible type

Любая идея?


person teucer    schedule 28.06.2011    source источник


Ответы (1)


Что я делаю в подобных случаях, так это смотрю, что стандартная библиотека делает в подобных случаях. Глядя на конкретные подклассы IndexedSeq, кажется, что они смешиваются с GenericTraversableTemplate. Имея это в виду, переработав ваш код для его использования, я получаю:

import collection.mutable._
import collection.generic.GenericTraversableTemplate
import collection.generic.GenericCompanion

class NewColl[V](values:Vector[V]) extends IndexedSeq[V] with 
    GenericTraversableTemplate[V, NewColl] {

  def fromSeq[V](seq: Seq[V]): NewColl[V] = new NewColl(Vector(seq: _*))

  override def companion: GenericCompanion[NewColl] = new GenericCompanion[NewColl]() {
    def newBuilder[A]: Builder[A, NewColl[A]] = new Builder[A, NewColl[A]] {
      val elems = new ArrayBuffer[A]()
      def +=(a:A) = { elems += a; this } 
      def clear() { elems.clear }
      def result(): NewColl[A] = fromSeq(elems)
    }
  }

}

(с удаленным someOtherParams для ясности)

Обратите внимание, что есть и другие вопросы по SO, связанные с созданием классов в структуре коллекции scala 2.8. Например, 5200505, который указывает на один из моих любимых документов Архитектура коллекций Scala. Также недавно Джош Суэрет написал запись в блоге на создание собственного класса коллекции.

person huynhjl    schedule 29.06.2011
comment
результатом map по-прежнему будет IndexedSeq вместо NewColl! - person teucer; 29.06.2011
comment
@teucer, вам необходимо указать CanBuildFrom, см. scala -lang.org/docu/files/collections-api/. Я рекомендую просмотреть/прочитать Архитектуру коллекций Scala, а затем попытаться реализовать свою коллекцию. Делать наоборот просто сложнее без всякой причины. - person huynhjl; 30.06.2011