我在以下代码中遇到了隐式转换的问题:
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的一部分,我希望能够在同一编译单元中使用两者。
toB(a)
,如果后面的方法没有覆盖前面的方法,编译器怎么知道你指的是哪一个?OP应该像你说的那样给隐式定义命名,比如AtoXB
和AtoYB
,因为X.B
和Y.B
是不同的类。 - Luigi Plinge