【发布时间】:2016-08-24 00:17:25
【问题描述】:
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] {})
^
为什么Subtrait 伴随对象中的implicit def 的优先级不高于Supertrait 中的优先级?
我希望子特征的伴随对象中的implicit defs 比超特征中的优先级更高。
更新
LowPriorityImplicits 技巧也不起作用。见Enforcing precedence in implicit instances in Scala。
【问题讨论】:
标签: scala implicit companion-object