Создание типизированной коллекции
Я пытаюсь понять коллекции 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". Также недавно Джош Суерет написал запись в блоге о создании собственного класса коллекции.