我在以下代码中遇到隐式转换问题:
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的一部分,我希望能够在同一个编译单元中使用它们。
答案 0 :(得分:7)
当您在同一范围内导入两者时,Y.toB
覆盖X.toB
似乎正在发生的事情。如果我将import Y._
放在之前,然后import X._
,那么它就可以了。另外,如果我将Y
隐含的内容重命名为其他内容(例如toYB
),则无论您将其置于何种顺序,它都会有效。