暗黙的なものを探すとき、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
、すべてが正常にコンパイルされます。