まず、簡単な説明。コンパニオンオブジェクトに他のタイプの暗黙を配置し、その暗黙をクラスのスコープにインポートすると、明示的に一度参照されるまで(またはクラスの上で定義されるまで)暗黙の解決中に見つからないようです。以下の例。
class A(val a: Something)
object A {
implicit val default = ... //found by default
}
object B {
def func(fn: => T)(implicit a: A) = ...
}
class Broken {
def doSomething = {
import Broken._ // or Broken.actual
B.func { ... } // Uses A.default, not Broken.actual for implicit
}
}
object Broken {
implicit val actual = ...
}
class Fixed {
def doSomething = {
import Fixed._
println(actual) //reference actual
B.func { ... } // uses Fixed.actual
}
}
object Fixed {
implicit val actual = ...
}
object WTF {
implicit val actual = ...
}
class WTF {
def doSomething = {
import WTF._
B.func { ... } // With object definition first this works without referencing actual
}
}
この時点で、コンパイラのバグを発見したと推測しているので、Scala に対して Jira を開きますが、それまでの間、これが予想されるかどうか、または既に開いているものがあるかどうかを知っている人がいるかどうか疑問に思っています。これのバグ?
編集: https://issues.scala-lang.org/browse/SI-7830
edit2: 問題を適切に再現するために、すべての実際の値とデフォルトの値から ": A" 型宣言を削除しました。