trait Eq[-A] {
def eq(a: A, b: A): Boolean
}
object Eq {
implicit object IntEq extends Eq[Int] {
def eq(a: Int, b: Int) = a == b
}
}
trait Supertrait[+A]
object Supertrait {
implicit def Eq[A: Eq]: Eq[Supertrait[A]] = ???
}
trait Subtrait[+A] extends Supertrait[A]
object Subtrait {
implicit def Eq[A: Eq]: Eq[Subtrait[A]] = ???
}
def f[A](x: Subtrait[A])(implicit ev: Eq[Subtrait[A]]) = ???
f(new Subtrait[Int] {})
このコードをコンパイルすると、次のエラーが発生します。
Error:(32, 4) ambiguous implicit values:
both method Eq in object Supertrait of type [A](implicit evidence$1: Eq[A])Eq[Supertrait[A]]
and method Eq in object Subtrait of type [A](implicit evidence$2: Eq[A])Eq[Subtrait[A]]
match expected type Eq[Subtrait[Int]]
f(new Subtrait[Int] {})
^
コンパニオン オブジェクトの が のオブジェクトよりも優先implicit def
されないのはなぜですか?Subtrait
Supertrait
サブトレイトimplicit def
のコンパニオン オブジェクトの s が、スーパートレイトのオブジェクトよりも優先されることを望みます。
アップデート
LowPriorityImplicits
トリックも機能しません。Scala の暗黙的なインスタンスでの優先順位の適用を参照してください。