在查找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
- 那么编译就好了。
这是编译器错误吗?或者我错过了一些关于Scala范围规则的内容?
我还应该提到这个问题只有在隐式解决时才会出现。如果我们显式传递BarCounter
对象,那么一切都很好。