【发布时间】:2017-05-22 09:46:51
【问题描述】:
仅当对集合进行一次操作时,使用隐式 CanBuildFrom 参数似乎才能返回相同类型的集合。有没有一种简单的方法可以让更多逻辑复杂的方法返回与参数类型相同的类型?
给定以下代码:
def trimCharacters(items: Iterable[String]): Iterable[String] =
items map (_.replaceAll("\\W", "")) map (_.replaceAll("\\w", ""))
如果您将items 的集合类型和返回类型都更改为Iterable 的子类型有效子类型,代码仍将编译。我想概括一下,以便调用者根据提供的Iterable 的类型选择返回类型。
This answer utilizing CanBuildFrom 接近,但只有原始的第一个 map:
def trimNonWordCharacters[T <: Seq[String]]
(items: T with SeqLike[String, T])
(implicit cbf: CanBuildFrom[T, String, T]): T =
items map (_.replaceAll("\\W", ""))
执行第二张地图的简单动作:
def trimCharacters[T <: Seq[String]]
(items: T with SeqLike[String, T])
(implicit cbf: CanBuildFrom[T, String, T]): T =
items.map(_.replaceAll("\\W", "")).map(_.replaceAll("\\w", ""))
中断编译:
type mismatch;
[error] found : Seq[String]
[error] required: T
是否有允许编译的更改?
【问题讨论】:
标签: scala generics collections