Dan*_*hin 4 scala scala-collections
我试图Traversable通过pimping via 添加一些特征方法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)
}
Run Code Online (Sandbox Code Playgroud)
这失败了,错误:
错误:(21,59)类型不匹配;
发现:scala.collection.generic.CanBuildFrom [Repr,A,That]
required:scala.collection.generic.CanBuildFrom [Traversable [A],A,That]
traversable.map {a => println(name +":"+一个); a}(bf)^
我猜测因为Reprin CanBuildFrom[-Repr, -Elem, +To]是逆变的,因此我Repr的上限Traversable[A]可能不起作用.
但总的来说,我很失落.有人可以帮忙吗?
您必须使用TraversableLike更高级的kinded类型才能使类型推理器满意并使其适用于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)
}
Run Code Online (Sandbox Code Playgroud)
编译器现在能够正确地推断出您的集合的类型,C[A]而不是一般地查找CanBuildFrom[Traversable[A],...]
根据经验,当您想要返回与传入的集合类相同的集合类时,您必须使用这些*Like类