Scala隐式转换问题

时间:2012-02-06 12:50:49

标签: 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"
}

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

error: value << is not a member of A
a << "Test"

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

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

1 个答案:

答案 0 :(得分:7)

当您在同一范围内导入两者时,Y.toB覆盖X.toB似乎正在发生的事情。如果我将import Y._ 放在之前,然后import X._,那么它就可以了。另外,如果我将Y隐含的内容重命名为其他内容(例如toYB),则无论您将其置于何种顺序,它都会有效。