2012-02-06 18 views
6

मैं निम्नलिखित कोड में निहित रूपांतरण के साथ समस्या हो रही है:स्काला अंतर्निहित रूपांतरण मुद्दा

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

टेस्ट कारणों में पिछले बयान संकलन त्रुटि:

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

लेकिन अगर मैं से import Y._ को दूर परीक्षण, यह ठीक संकलित करता है।

ध्यान दें कि वास्तविक कोड में X.B और Y.B जावा लाइब्रेरी के लिए स्कैला डीएसएल का हिस्सा हैं और मैं एक ही संकलन इकाई में दोनों का उपयोग करने में सक्षम होना चाहता हूं।

उत्तर

7

ऐसा लगता है कि क्या हो रहा है यह है कि Y.toBX.toB ओवरराइड कर रहा है जब आप दोनों एक ही दायरे में आयात करते हैं। अगर मैंने से पहले import X._ रखा है, तो यह काम करता है। इसके अलावा, अगर मैं Y का नाम किसी अन्य चीज़ के लिए निहित करता हूं (उदा। toYB), तो यह कोई फर्क नहीं पड़ता कि आप इसे किस क्रम में डालते हैं।

+3

और यह वही है जो आप उम्मीद करते हैं। यह जावा में एक स्थिर आयात की तरह है। यदि आपने 'toB (ए) 'के रूप में अंतर्निहित विधि का आह्वान किया है, तो संकलक कैसे पता चलेगा कि आपका क्या मतलब है यदि बाद में किसी ने दूसरे को ओवरराइड नहीं किया? ओपी को 'एटीएक्सबी' और' एटीवाईबी 'जैसे नामों को निहित करना चाहिए जैसा कि आप कहते हैं, क्योंकि' एक्स.बी' और 'वाई.बी' अलग-अलग वर्ग हैं। –

+0

दरअसल, किसी भी तरह से मैं निहित विधि नामों को समस्या का कारण बनने की उम्मीद नहीं कर रहा था। मैंने नाम बदल दिया है और यह ठीक काम करता है, धन्यवाद! – elk

संबंधित मुद्दे