我正在尝试使用我自己的map
方法来丰富Scala集合,并且我很接近,但隐式转换不起作用。除此之外,还有什么我在这里不见了吗?我正在寻找网络上的各种其他资源,包括这个问题被标记为重复的SO答案,并且许多人在这里和那里都缺少某些东西(例如使用C[A] <: GenTraversable[A]
,使用{ {1}}而不是b()
,忘记b(xs)
,忘记了Array
等。)
BitSet
答案 0 :(得分:4)
我上周刚回答this very question about type inference。这是代码:
implicit def conv[A,C <: GenTraversable[A]](xs: C with GenTraversableLike[A,C]) = new {
def mymap[B,D](f: A => B)(implicit b: CanBuildFrom[C,B,D]): D = {
val builder = b(xs)
xs foreach { x => builder += f(x) }
builder.result
}
}
在这种特殊情况下,我本可以使用GenTraversable
代替GenTraversableLike
。我更喜欢后者,因为它提供更多。
问题在于,声明[A, C <: GenTraversable[A]]
不指示Scala从A
的类型推断出C
的类型。类型是根据它们在参数中的使用方式推断出来的,然后根据类型参数指定的边界进行检查。
所以当我写xs: C with GenTraversable[A]
时,我让Scala知道它应该从A
推断xs
。编写GenTraversableLike[A, C]
告诉Scala它应该为返回相同集合的方法选择返回 C
的集合。这意味着您可以致电filter
并获取C
,而不是返回GenTraversable
。
至于希望包含观点,我不知道你将如何完成。
答案 1 :(得分:1)
我已经回答了类似的问题here。您还可以参考this thread,其中Rex Kerr解释了如何执行此类拉皮条。