2012-02-06 11 views
6

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.

Odpowiedz

7

Wygląda na to, że Y.toB nadpisuje X.toB podczas importowania obu w tym samym zakresie. Jeśli wstawię import Y._przed następnie import X._, to działa. Ponadto, jeśli zmienię nazwę na Y na coś innego (np. toYB), działa bez względu na kolejność, w jakiej ją umieścisz.

+3

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. –

+0

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

Powiązane problemy