2017-01-03 196 views
1

我想從現有的Seq集合中創建一個新的自定義Scala集合。我有一個名爲價性狀,其保持數據,如下命名VEC在Scala中創建自定義Seq集合

trait Ref[A] { 
    def get: A 
    def getAsOption: Option[A] 
    def dataType: Class[A] 
    // other methods 
} 

我的自定義集合,其是參考序列[A](即VEC [A]等同於Seq [參考文獻[A]]),我想創建一個像這樣的自定義集合的原因是因爲我想讓集合中的Ref的類型參數在自定義方法中處理。我的代碼如下

trait VecLike[A, +Repr <: Seq[Ref[A]]] 
    extends SeqLike[Ref[A], Repr] 
    with TraversableLike[Ref[A], Repr] { 
// custom methods 
} 

trait GenVec[A] 
    extends VecLike[A, Seq[Ref[A]]] 
    with Seq[Ref[A]] 
    with PartialFunction[Int, Ref[A]] 

abstract class AbstractVec[A](vec: Ref[A]*) 
    extends AbstractSeq[Ref[A]] 
    with GenVec[A] {...} 

class Vec(vec: Ref[A]*) 
    extends AbstractVec[A](vec:_*) 
    with VecLike[A, Vec[A]] 
    with GenericTraversableTemplate[Ref[A], Seq] 

但是當我打電話map()函數

Vec(1,2,3,4).map(intToString) 

它返回一個序列[字符串],該預期的結果VEC [字符串。我也試着用SeqFactory [Seq]在伴隨對象中創建自定義的CanBuildFrom,但失敗了。 :(:(

誰能給我這件事,我怎麼執行實現這一目標提出了一些建議?

回答

0

我完成了它,這是我的錯誤,我創建了錯CanBuildFrom下面是全面實施以CanBuildFrom(CBF從斯卡拉GenericCanBuildFrom啓發)

現在我可以收到VEC的結果,而不是序列後調用map()函數如下

val vec = Vec(1,2,3,4) 
var vecStr : Vec[String] = vec.map(intToString)