为什么在Scala伴生对象中,隐式对象的优先级高于隐式val?

为什么在Scala伴生对象中,隐式对象的优先级高于隐式val?,scala,Scala,我一直在玩这个小例子,试图更好地了解scala是如何解析隐式的。我刚刚发现了在伴随对象中声明隐式对象和隐式val之间的区别 示例中名为“证据[-B]”的类型类是逆变的;e、 g.在需要[衍生]证据的情况下,可以使用证据[基础] 我已尝试使用Scala 2.11.7编译以下代码: trait Evidence[-B] { def hello(input: B): String } trait Base object Base { implicit object BaseEvidence

我一直在玩这个小例子,试图更好地了解scala是如何解析隐式的。我刚刚发现了在伴随对象中声明隐式对象和隐式val之间的区别

示例中名为“证据[-B]”的类型类是逆变的;e、 g.在需要[衍生]证据的情况下,可以使用证据[基础]

我已尝试使用Scala 2.11.7编译以下代码:

trait Evidence[-B] {
  def hello(input: B): String
}

trait Base
object Base {
  implicit object BaseEvidence extends Evidence[Base] {
    override def hello(input: Base): String = "Evidence[Base] from implicit object"
  }
}

class Derived extends Base
object Derived {
  implicit val derivedEvidence: Evidence[Derived] = new Evidence[Derived] {
    override def hello(input: Derived): String = "Evidence[Derived] from implicit val"
  }
}

object Main extends App {
  def hello[A](input: A)(implicit ev: Evidence[A]): Unit = {
    println(ev.hello(input))
  }
  hello(new Derived)
}
但是,编译器给出了一个错误“不明确的隐式值”:

根据我对隐式解析规则的理解,应该首先搜索
派生的
的伴随对象;然后是基类
base
的伴生对象

将隐式val derivedEvidence更改为隐式对象时,代码编译:

object Derived {
  implicit object DerivedEvidence extends Evidence[Derived] {
    override def hello(input: Derived): String = "Evidence[Derived] from implicit object"
}
这种行为的原因是什么

object Derived {
  implicit object DerivedEvidence extends Evidence[Derived] {
    override def hello(input: Derived): String = "Evidence[Derived] from implicit object"
}