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 建议)是,如果我们颠倒顺序 - 也就是说,我们object Bar之前定义case class Bar- 一切编译得很好。

这是编译器错误吗?或者我遗漏了一些关于 Scala 范围规则的内容?

我还应该提到,这个问题只出现在隐式解决方案中。如果我们显式地传递BarCounter对象,一切都编译得很好。

4

1 回答 1

1

这似乎是一个实际的编译器错误。我已经把它贴在这里了

于 2012-10-18T16:56:50.423 回答