Scala隐式转换冲突奇怪

Scala implicit conversion conflict strangely

我发现一个奇怪的编译错误:

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!
}

由于mAmB冲突导致无法编译。 但这很奇怪,因为类型 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
}

可以编译。为什么第一个case编译不通过?

发生这种情况是因为当编译器试图找到隐式变量作为​​ m 传递给 f 它不知道预期的 return 类型(因为它取决于哪个隐式变量将被选中)。它创建了一种循环依赖。

PS:您不需要使 f 隐式说明这个问题。