我正在尝试通过 Traversable 拉皮条向 implicit class 特征添加一些方法。

但是我对 CanBuildFrom 特性有点迷失。考虑以下:

implicit class TraversableExt[+A, +Repr <: Traversable[A]](traversable: Repr) {
  def debug[That](name: String)(implicit bf: CanBuildFrom[Repr, A, That]): That =
    traversable.map{ a => println(name + ": " + a); a }(bf)
}

这失败并出现错误:



我猜是因为 Repr 中的 CanBuildFrom[-Repr, -Elem, +To] 是逆变的,因此我的 ReprTraversable[A] 上限的可能不起作用。

但总的来说,我很迷茫。任何人都可以帮忙吗?

最佳答案

您必须使用 TraversableLike 和更高级的类型来使类型推断器满意并使其与 CanBuildFrom 一起使用:

implicit class TraversableExt[A, C[X] <: TraversableLike[X, C[X]]](traversable: C[A]) {
  def debug[That](name: String)(implicit bf: CanBuildFrom[C[A], A, That]): That =
    traversable.map{ a => println(name + ": " + a); a }(bf)
}

编译器现在能够正确推断集合 C[A] 的类型,而不是一般查找 CanBuildFrom[Traversable[A],...]
根据经验,当您想返回与传入的集合类相同的集合类时,您必须使用 *Like

关于scala - 如何使用 CanBuildFrom 为 Traversable 定义隐式类?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36515402/

10-10 16:56