Scala隐式转换问题

elk*_*elk 6 scala implicit-conversion

我在以下代码中遇到隐式转换问题:

trait A {
  def send(s: String): String = {
    println(s)
    s
  }
}

object X {
  implicit def toB(a: A): B = new B(a)

  class B(a: A) {
    def <<(s: String): String = a send s
  }
}

object Y {
  implicit def toB(a: A): B = new B(a)

  class B(a: A) {
  }
}

object Test extends App {
  import X._
  import Y._
  val a: A = new A {}
  a << "Test"
}
Run Code Online (Sandbox Code Playgroud)

Test中的最后一个语句导致编译错误:

error: value << is not a member of A
a << "Test"
Run Code Online (Sandbox Code Playgroud)

但是,如果我import Y._从Test中删除,它编译得很好.

请注意,在实际代码中,XB和YB都是Java库的Scala DSL的一部分,我希望能够在同一个编译单元中使用它们.

Dyl*_*lan 7

当您在同一范围内导入时,看起来正在发生的事情是Y.toB重写X.toB.如果我把import Y._ 以前那么import X._,那么它的工作原理.此外,如果我将Y隐含的名称重命名为其他内容(例如toYB),那么无论您将其置于何种顺序,它都会起作用.

  • 这就是你所期望的.这就像Java中的静态导入.如果你将隐式方法调用为`toB(a)`,如果后者没有覆盖另一个,编译器将如何知道你的意思?OP应该像你说的那样给出像'AtoXB`和`AtoYB`这样的隐式defs名称,因为`XB`和`YB`是不同的类. (3认同)