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!
}
由于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
}
可以编译。为什么第一个case编译不通过?
发生这种情况是因为当编译器试图找到隐式变量作为 m
传递给 f
它不知道预期的 return 类型(因为它取决于哪个隐式变量将被选中)。它创建了一种循环依赖。
PS:您不需要使 f
隐式说明这个问题。
我发现一个奇怪的编译错误:
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
}
可以编译。为什么第一个case编译不通过?
发生这种情况是因为当编译器试图找到隐式变量作为 m
传递给 f
它不知道预期的 return 类型(因为它取决于哪个隐式变量将被选中)。它创建了一种循环依赖。
PS:您不需要使 f
隐式说明这个问题。