当寻找implicits,Scala编译器看起来,在其他地方,在所涉及的类的各个部分的同伴对象。 很显然,虽然,它不能当隐式转换的类本身是用来执行该查询,如果同伴对象之前定义。 该小例子,我能够编造是:
trait Counter[A] {
def count(a: A): Int
}
object Foo {
def foo[A](a: A)(implicit c: Counter[A]) = c.count(a)
}
case class Bar(id: Int) {
import Foo._
def count = foo(this)
}
object Bar {
implicit object BarCounter extends Counter[Bar] {
def count(b: Bar) = b.id
}
}
这编译失败说could not find implicit value for parameter c: Counter[Bar]
-我使用Scala的2.9.1。
有趣的(由rjsvaljean建议)是,如果我们颠倒顺序-也就是说,我们定义object Bar
之前case class Bar
- verything编译罚款。
这是一个编译器错误? 或者我失去了一些东西有关Scala的范围规则?
我还要提到的是这个问题只与隐含的分辨率就出现了。 如果我们明确地传递BarCounter
对象,一切编译罚款。