2011-09-21 29 views
5
import swing._ 

object PeerTest extends SimpleSwingApplication { 
    def top = new MainFrame { 
    val p = peer.getMousePosition 
    } 
} 

यह संदर्भ अस्पष्ट क्यों है?

error: ambiguous reference to overloaded definition, 
both method getMousePosition in class Container of type (x$1: Boolean)java.awt.Point 
and method getMousePosition in class Component of type()java.awt.Point 
match expected type ? 
val p = peer.getMousePosition 

देता है, लेकिन प्रकार

val p: Point = peer.getMousePosition 

जोड़ने यह ठीक करता है। क्यूं कर?

संपादित करें: का कारण बनता है समस्या:

class A { 
    def value() = 123 
} 

class B extends A { 
    def value(b: Boolean) = 42 
} 

object Main extends App { 
    println ((new B).value) 
} 

का कारण नहीं है समस्या:

class A { 
    def value() = 123 
    def value(b: Boolean) = 42 
} 

class B extends A {} 

object Main extends App { 
    println ((new B).value) 
} 

तो मैं जवाब की व्याख्या करने के कारण है कि यह केवल तब होता है जब तरीकों विभिन्न वर्गों में हैं लगता है ।

उत्तर

9

दो विधियों getMousePosition बिना किसी एक और एक बुलियन पैरामीटर के साथ हैं।

एक प्रकार एनोटेशन स्काला पता नहीं है अगर आप एक पैरामीटर (एक Function1 वस्तु) में विधि के लिए एक संदर्भ चाहते हैं के बिना या आप मानकों (एक Point में जिसके परिणामस्वरूप) के बिना एक आह्वान करने के लिए चाहते हैं।

अपेक्षित प्रकार निर्दिष्ट करना आपके इरादे को स्पष्ट करता है।

getMousePosition() का उपयोग करना भी काम करना चाहिए।

+1

तो अगर हम कक्षा में ओवरलोडिंग विधियों को जोड़ने का निर्णय लेते हैं तो हम लोगों के कोड को तोड़ सकते हैं ... यह बहुत अच्छा प्रतीत नहीं होता है। मैंने सोचा था कि विधि के बाद '_' डालने का तरीका आंशिक रूप से लागू फ़ंक्शन बनाने का तरीका था। –

+1

@ लुइगी अधिभार जोड़कर लोगों के कोड को तोड़ने के कई तरीके हैं, यह सिर्फ एक और तरीका है। –

+1

http://stackoverflow.com/questions/2510108/why-avoid-method-overloading – retronym

4

वांछित अधिभारित विकल्प को संदर्भित करने का एक और सीधा तरीका खाली तर्क सूची सहित है।

peer.getMousePosition() 
संबंधित मुद्दे