2012-02-06 44 views
6
Aşağıdaki kodda örtük dönüşüm ile ilgili bir sorun yaşıyorum

: Test nedenleri içindeScala örtük dönüştürme sorunu

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" 
} 

son deyimi derleme hatası: Ben den import Y._ kaldırmak Ancak

error: value << is not a member of A 
a << "Test" 

Test, iyi derler.

Gerçek kodda hem X.B hem de Y.B'nin bir Java kütüphanesi için Scala DSL'nin bir parçası olduğunu ve hem aynı derleme biriminde kullanabilmeyi unutmayın.

cevap

7

Neler olup bittiğine benziyor, aynı kapsamda içe aktardığınızda Y.toBX.toB'u geçersiz kılıyor. ve import X._ önce import Y._koyarsanız, o zaman çalışır. Ayrıca, Y'un başka bir şeye (ör. toYB) örtük olarak yeniden adlandırırsam, o zaman hangi siparişi koyarsanız onu çalışır.

+3

Ve beklediğiniz şey budur. Java'da statik bir ithalat gibi. Eğer örtülü yöntemi “toB (a)” olarak çağırdıysanız, derleyici hangisinin daha sonra diğerini geçersiz kılmadığını kastettiğini nasıl anlardı? OP, 'AtoXB' ve 'AtoYB' gibi örtük kusur isimlerini vermeli, XB' ve Y.B' gibi farklı sınıflardır. –

+0

Gerçekten de, örtülü yöntem adlarının soruna neden olmasını beklemiyordum. Yeniden adlandırdım ve şimdi iyi çalışıyor, teşekkürler! – elk

İlgili konular