我正在尝试向 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)
}
这失败并出现错误:
Error:(21, 59) type mismatch;
found : scala.collection.generic.CanBuildFrom[Repr,A,That]
required: scala.collection.generic.CanBuildFrom[Traversable[A],A,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
类(class)
关于scala - 如何使用 CanBuildFrom 为 Traversable 定义隐式类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36515402/