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