1

如何从不知道它的实现的 scala 集合中检索构建器?我已将参数类型限制为 TraversableLike 的后代,但它的 newBuilder 方法受到保护,我不能从外部调用它。

4

2 回答 2

4

生成器是通过使用CanBuildFrom隐式检索的,它会根据以下参数自动解析:

  • 输入集合中的元素类型
  • 输入集合的类型
  • 输出集合的合适类型。

例如,如果您在返回的 List[Int] 上执行映射_.toStringCanBuildFrom则将如下所示:

CanBuildFrom[List,Int,List[String]]

您应该依靠相同的机制来动态检索您需要的正确构建器。

于 2013-03-20T06:13:32.953 回答
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)
于 2013-03-20T06:13:58.430 回答