2013-03-20 101 views
1

如何從scala集合中檢索生成器,使其不可知關於它的實現?我將參數類型限制爲TraversableLike的後代,但它的newBuilder方法受到保護,我無法從外部調用它。從scala集合中檢索生成器

+0

如果你的代碼示例,我將完成我的答案有一個代碼片段 – Edmondo1984 2013-03-20 06:14:13

回答

4

生成器通過CanBuildFrom隱式的,這是以下參數的基礎上,自動解決的使用檢索到:

  • 輸入集合
  • 類型輸入集合的所述的類型的元素
  • 合適的輸出集合類型。

例如,如果你在一個列表[INT]返回_.toString進行映射,CanBuildFrom看起來如下:

CanBuildFrom[List,Int,List[String]] 

您應該依靠相同的機制來動態檢索你需要的正確建設者。

3

代碼片段將有助於提供一些上下文。你提到「參數類型」...

無論聲明這個參數,它是否有類型參數Repr?像

def mysteryMethod[A, Repr](arg: TraversableLike[A, Repr]): Builder[A, Repr] 

假設,你可以做這樣的事情:

import collection.TraversableLike 
import collection.mutable.Builder 
import collection.generic.CanBuildFrom 

def mysteryMethod[A, Repr](arg: TraversableLike[A, Repr])(implicit 
       cbf: CanBuildFrom[Repr, A, Repr]): Builder[A, Repr] = cbf.apply 

val t: TraversableLike[Int, Vector[Int]] = Vector(1, 2) 
val builder = mysteryMethod(t)     
builder += 3          
builder += 4         
builder.result      //> res2: Vector[Int] = Vector(3, 4) 
+2

scala.collection.generic.CanBuild是一個更好的類型因爲mysterymethod成爲'def mysteryMethod [A,B](xs:TraversableLike [A,B])(隱式cb:CanBuild [A,B]):Builder [A,B] = cb() ' – 2013-03-20 06:19:13

+0

@AndreasFlierl,謝謝,看起來更乾淨。因爲我不知道請求者在做什麼,所以我會留下我的答案。 – huynhjl 2013-03-20 06:25:41