Почему неявные значения внутри области, типизированные A и B, не являются неоднозначными, когда B расширяет A? - PullRequest
3 голосов
/ 20 сентября 2019

Почему код в Test2 компилируется, хотя у нас явно есть неоднозначные неявные значения?


object Method {
  def foo(implicit i: A): Unit = println(i.i)
}

trait A {
  val i: Int
}
class B(override val i: Int) extends A

object Test1 {
  implicit val i1: A = new A {
    val i: Int = 20
  }
}

object Test2 {
  implicit val i2: B = new B(10)
  import Test1._
  // This compiles fine and prints 10
  Method.foo
}

object Test3 {
  implicit val i2: A = new B(10)
  import Test1._
  // This does not compile, get `ambiguous implicit values`
  Method.foo
}

1 Ответ

4 голосов
/ 20 сентября 2019

В Test2 нет никакой двусмысленности.i2 имеет более конкретный тип, чем i1, поэтому i2 имеет более высокий приоритет, чем i1.

В Test3 i1 и i2 имеют одинаковый тип A, поэтомуэто двусмысленность.

https://stackoverflow.com/a/57934397/5249621

...