Я пытаюсь понять коллекции 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
Любая идея?
Ответ 1 · рейтинг 3 · huynhjl
Что я делаю в подобных случаях, так это смотрю, что стандартная библиотека делает в подобных случаях. Глядя на конкретные подклассы 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. Также недавно Джош Суэрет написал запись в блоге на создание собственного класса коллекции.