2011-06-28 108 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

相關問題