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

Я пытаюсь понять коллекции 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]
}

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

переопределяющий метод newBuilder в признаке TraversableLike
   типа => scala.collection.mutable.Builder[V,NewColl[V]];
метод newBuilder в признаке GenericTraversableTemplate
   типа => scala.collection.mutable.Builder[V,IndexedSeq[V]] имеет несовместимый тип

Любая идея?

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)
    }
  }

}

(для ясности удалены некоторые другие параметры)

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

Другие вопросы по тегам