Scala编译器发现了CanBuildFrom的哪个实例?

Scala编译器发现了CanBuildFrom的哪个实例?,scala,implicit,Scala,Implicit,各位。请原谅我问了一个关于Scala的愚蠢问题。 虽然我已经在Scala中编程大约两年了,但我仍然发现很难理解隐式用法。让我们举一个例子进行讨论: Array(1,2,3,4).map(x => x) 如果您查找scaladoc,就无法在Arrayclass上找到方法map。map可以应用于Array(1,2,3,4)的原因是在scala.Predef中定义了一个隐式函数implicit def intArrayOps(xs:Array[Int]):ArrayOps[Int] 但是,有

各位。请原谅我问了一个关于Scala的愚蠢问题。 虽然我已经在Scala中编程大约两年了,但我仍然发现很难理解
隐式
用法。让我们举一个例子进行讨论:

Array(1,2,3,4).map(x => x) 
如果您查找scaladoc,就无法在
Array
class上找到方法
map
map
可以应用于
Array(1,2,3,4)
的原因是在
scala.Predef
中定义了一个隐式函数
implicit def intArrayOps(xs:Array[Int]):ArrayOps[Int]


但是,有两个参数列表,其中第二个参数列表写为
隐式bf:CanBuildFrom[Array[T],B,That])
。现在我想知道编译器在
数组(1,2,3,4)
上应用
map
时,在哪里找到类型
CanBuildFrom
的正确参数

隐式解析包括在伴生对象中搜索隐式参数的类型,以及在伴生对象中搜索隐式参数的类型参数。在上面的示例中,map的签名如下

def map[B, That](f: (Int) => B)(implicit bf: CanBuildFrom[Array[Int], B, That]): That
因为我们没有这方面的类型要求,所以现在可以忽略它。在我们查看本地和容器范围并没有找到匹配的隐式之后,下一个查找隐式的位置将是CanBuildFrom的伴生对象。然而,它没有伴星。所以我们继续,在数组中查找隐式。我们发现其中一种是

implicit def canBuildFrom[T](implicit m: ClassManifest[T]): CanBuildFrom[Array[_], T, Array[T]]

因为我们没有类型要求和匹配的隐式,所以“That”被强制为Array[Int]类型并完成了我们的键入

这个问题的部分答案是关于StackOverflow的其他问题。让我试着总结一下:

你需要知道的第一个部分是。您可以从中找到有关CanBuildFrom的更多详细信息

如果您已经理解了答案中提到的隐式-您应该看看Scala集合的构造。对它们的继承层次结构进行了解释,并对列表进行了说明。所有这些都是由建筑商建造的。这在关于的问题中有详细的解释

要总结你的知识,你应该知道如何拉皮条。此外,在中的StackOverflow中也解释了这一点

请注意,有关StackOverflow的最佳答案总结在