Daniel Sobral展示了我们如何创建一个返回相同集合类型的方法,在这个问题的答案中调用它:Returning original collection type in generic method
是否可以对使用映射返回相同集合类型的不同参数化版本的方法执行相同的操作?
例如
def foo[A](xs: GenTraversable[A]) = xs map (_.toString)
foo( List(1, 2, 3) )
返回res: GenTraversable[String] = List(1, 2, 3)
这可以改编以便
foo( Set(1, 2, 3) )
返回Set[String]
foo( List(1, 2, 3) )
返回List[String]
foo( Vector(1, 2, 3) )
返回Vector[String]
答案 0 :(得分:7)
延伸丹尼尔对相关问题的回答:
def foo[A,T[X] <: TraversableLike[X,T[X]]](xs: T[A])(implicit cbf: CanBuildFrom[T[A],String,T[String]]): T[String] = xs.map(_.toString)
请注意,map
method defined in TraversableLike
采用隐式CanBuildFrom
参数。
这用于为所需的集合类型创建构建器,因此必须按照它在代码中的方式进行参数化(即,基于类型T[A]
的集合,从{{构建T[String]
1}}元素)。