1
当查找含义时,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建议)是,如果我们颠倒了顺序 - 也就是说,我们在case class Bar
之前定义了object Bar
- 编译得很好。
这是编译器错误吗?或者我错过了关于Scala范围规则的一些事情?
我还应该提到,这个问题只会出现在隐式解析中。如果我们明确地通过了BarCounter
对象,一切都编译好。
我不知道为什么,但是切换'object Foo'和'case class Foo'的顺序使得它不会引发编译错误。 – rjsvaljean
@rjsvaljean奇怪 - lloks喜欢编译器故障。你介意加入它作为回应,以便我可以接受它吗? – Andrea
我不知道。编辑包含该数据的问题是否更有用,并等待解释为什么它无法编译而不是解决问题的答案?甚至可能完全改变这个问题,使它更通用并重新发布。 – rjsvaljean