Scala隐式转换问题

6

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

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个回答

7
似乎的情况是,在同一范围内导入 X.toBY.toB 时,Y.toB 会覆盖 X.toB。如果我先导入 import Y._ 再导入 import X._,那么它就会正常工作。此外,如果将 Y 的隐式重命名为其他名称(例如 toYB),则无论您以何种顺序导入它,它都有效。

3
这是你所期望的。就像Java中的静态导入一样。如果你调用隐式方法作为toB(a),如果后面的方法没有覆盖前面的方法,编译器怎么知道你指的是哪一个?OP应该像你说的那样给隐式定义命名,比如AtoXBAtoYB,因为X.BY.B是不同的类。 - Luigi Plinge
的确,我没想到隐式方法名称会引起问题。我现在已经更名了,现在运行良好,谢谢! - elk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接