【发布时间】:2014-07-19 18:37:36
【问题描述】:
我在 Scala 上对 CanBuildFrom 特征进行了实验,当我尝试将 Array 类型自动转换为 Seq 类型时看起来不错,我认为原因是我们在范围内有 CanBuildFrom[Array, T, Seq[T]]。但是,如果我尝试将 Array 转换为 Set,它就不起作用。此外,将 Seq 转换为 Set 也无法正常工作。我只是想知道我是否应该将隐式定义为相同类型的 CanBuildFrom 伴随对象以实现转换?如果是,为什么scala默认不提供,是因为Set是一个函数吗?
这是Array to Seq的代码
def transform[U[_]](col: Array[String])(implicit cbf: CanBuildFrom[Array[String], String, U[String]]): U[String] = {
val builder = cbf()
for (ele <- col) builder += ele
builder.result()
}
CanBuildFromSpec.transform[Seq](Array("123", "3"))
如果我想转换为数组来设置或列表,它不起作用
CanBuildFromSpec.transform[List](Array("123", "3")) //compilation error, cannot construct
CanBuildFromSpec.transform[Set](Array("123", "3")) //compilation error, cannot construct
【问题讨论】:
-
您可以将
collection.breakOut作为CanBuildFrom提供给您的transform,以允许您构建任何集合(至少可以包含字符串的任何集合)。或者您可以声明所需类型的隐式CanBuildFrom。
标签: scala scala-collections generic-programming generic-collections