斯卡拉的定义顺序很重要?

时间:2012-10-08 07:56:44

标签: scala compiler-construction companion-object

在查找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对象,那么一切都很好。

1 个答案:

答案 0 :(得分:1)

这似乎是一个实际的编译器错误。我发布了here