2011-06-28 58 views
1

II想了解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

任何想法?

回答

3

我在类似的情况下做的是看标准库在类似情况下的功能。看看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相关建筑类的斯卡拉2.8其他问题收集框架。例如5200505,它指向我最喜欢的文档The Architecture of Scala Collections之一。最近,Josh Suereth在创建自己的收藏课程时写了一个blog entry

+0

“map”的结果仍然是IndexedSeq而不是NewColl! – teucer

+0

@teucer,你需要提供一个'CanBuildFrom',参见http://www.scala-lang.org/docu/files/collections-api/collections-impl_5.html。我建议浏览/阅读* Scala Collections的架构*,然后尝试实现您的收藏。相反,无缘无故更具挑战性。 – huynhjl

相关问题