返回相同的集合类型,参数化不同

Lui*_*hys 4 generics collections scala scala-collections

Daniel Sobral展示了我们如何创建一个返回相同集合类型的方法,在这个问题的答案中调用它:在泛型方法中返回原始集合类型

是否可以对使用映射返回相同集合类型的不同参数化版本的方法执行相同操作?

例如

def foo[A](xs: GenTraversable[A]) = xs map (_.toString)
Run Code Online (Sandbox Code Playgroud)

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]

Mor*_*itz 8

延伸丹尼尔对相关问题的回答:

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)
Run Code Online (Sandbox Code Playgroud)

请注意,map定义TraversableLike方法采用隐式CanBuildFrom参数.这用于为所需的集合类型创建构建器,因此必须按照它在代码中的方式进行参数化(即,基于类型的集合,从元素T[A]构建a ).T[String]String