Я обнаружил странную ошибку компиляции:
class A
class B
object M {
implicit val mA: M[A] = d => new A
implicit val mB: M[B] = d => new B
}
trait M[K] {
def get(d: D): K
}
object D {
implicit def f[K](d: D)(implicit m: M[K]): K = m.get(d)
}
class D
object Main {
val d = new D
val a: A = d // This line can't compile!
}
, которая не может быть скомпилирована из-за конфликта mA
и mB
.Но это странно, поскольку тип B
не соответствует нашему типу результата.
Если я прокомментирую mB
следующим образом
class A
class B
object M {
implicit val mA: M[A] = d => new A
//implicit val mB: M[B] = d => new B
}
trait M[K] {
def get(d: D): K
}
object D {
implicit def f[K](d: D)(implicit m: M[K]): K = m.get(d)
}
class D
object Main {
val d = new D
val a: A = d // can compile
}
, который может компилироваться.Почему нельзя скомпилировать первый случай?