我在下面的代码中遇到了隐式转换的问题:
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"但是,如果我从测试中删除import Y._,它可以很好地编译。
请注意,在实际代码中,X.B和Y.B都是Java库的Scala DSL的一部分,我希望能够在同一编译单元中使用这两种语言。
发布于 2012-02-06 21:25:39
看起来发生的事情是,当你在同一范围内导入两者时,Y.toB会覆盖X.toB。如果我将import Y._放在import X._之前,那么它就可以工作。此外,如果我将Y的隐含名称重命名为其他名称(例如toYB),则无论您将其放入哪个顺序,它都可以正常工作。
https://stackoverflow.com/questions/9160375
复制相似问题