Mam problem z niejawna konwersja w poniższym kodzie:Scala problem niejawna konwersja
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"
}
Ostatnia wypowiedź w przyczyn testowych kompilacji błąd:
error: value << is not a member of A
a << "Test"
Jednak jeśli usunąć z import Y._
Testuj, kompiluje się dobrze.
Zauważ, że w rzeczywistym kodzie zarówno X.B, jak i Y.B są częścią Scala DSL dla biblioteki Java i chciałbym móc używać obu w tej samej jednostce kompilacji.
Tego właśnie oczekujesz. To jest jak statyczny import w Javie. Jeśli wywołałeś metodę niejawną jako 'toB (a)', w jaki sposób kompilator wiedziałby, który z nich miałeś na myśli, jeśli późniejszy nie zastąpił drugiego? OP powinien podawać domyślne nazwy defs takie jak 'AtoXB' i' AtoYB', jak mówisz, ponieważ 'X.B' i' Y.B' są różnymi klasami. –
Rzeczywiście, nie spodziewałem się, że implicite nazwy metod będą powodować problem. Zmieniłem nazwę i teraz działa dobrze, dzięki! – elk