我正在尝试通过 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]
是逆变的,因此我的 Repr
是 Traversable[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/