2009-10-09 11 views
50

अगर मैं जावा में इस लाइन लिखने:जावा में शून्य के लिए कौन सा अधिभार चुना जाएगा?

JOptionPane.showInputDialog(null, "Write something"); 

जो विधि बुलाया जाएगा?

  • showInputDialog(Component parent, Object message)
  • showInputDialog(Object message, Object initialSelectionValue)

मैं इसे परीक्षण कर सकते हैं। लेकिन अन्य मामलों में इसी तरह, मैं जानना चाहता हूं कि क्या होता है।

+3

वास्तव में एक अच्छा सवाल है कि, भले ही वह काल्पनिक है पाने के संकलन करने की कोशिश (आप, पहले कॉल करने के लिए कभी नहीं चाहते हैं के रूप में यह 'JOptionPane.showInputDialog के समान है (" कुछ लिखें "); ' – Powerlord

उत्तर

61

सबसे विशिष्ट विधि बुलाया जाएगा - इस मामले

showInputDialog(Component parent, Object message) 

यह आम तौर पर, कल्पना (15.12.2) में अधिभार संकल्प के "Determine Method Signature" कदम के तहत आता है में और विशेष रूप से "Choosing the Most Specific Method" में।

विवरण (जिसे आप यहां के रूप में कल्पना में बस के रूप में अच्छी तरह से पढ़ सकते हैं) में हो रही बिना

, परिचय एक अच्छा सारांश देता है:

यदि एक से अधिक सदस्य विधि दोनों सुलभ और के लिए लागू है एक विधि आमंत्रण, चुनने के लिए रन-टाइम विधि प्रेषण के लिए वर्णक प्रदान करना आवश्यक है। जावा प्रोग्रामिंग भाषा नियम का उपयोग करती है जो सबसे विशिष्ट विधि चयनित है।

अनौपचारिक अंतर्ज्ञान है कि एक विधि एक और यदि कोई मंगलाचरण पहले विधि द्वारा नियंत्रित एक संकलन समय प्रकार की त्रुटि के बिना अन्य एक को पारित किया जा सकता है की तुलना में अधिक विशिष्ट है।

+4

' f (null) 'को कॉल करने के बारे में क्या है जब विधियों' f (इंटीजर i) 'और' f (स्ट्रिंग एस) 'को परिभाषित किया गया है? न तो दूसरे की तुलना में अधिक विशिष्ट लगता है। – Stephan202

+0

@ स्टीफन 202: ग्रहण में, मैं 'विधि f (इंटीजर) प्रकार उदाहरण क्लास के लिए संदिग्ध है' यह स्थैतिक तरीकों के साथ था – Powerlord

+0

@ आर। बेमेरोस: बिल के उत्तर से निर्णय लेना, यह गैर स्थैतिक तरीकों के लिए भी सही होगा। परीक्षण के लिए धन्यवाद! – Stephan202

9

न तो। आपको एक संकलक त्रुटि मिल जाएगी जो आपको यह बताने के लिए कहती है कि आप किस विधि को कॉल करना चाहते हैं। आप स्पष्ट रूप से पहला तर्क कास्टिंग करके कर सकते हैं:

showInputDialog((Object) null, "Write something"); 

या

showInputDialog((Component) null, "Write something"); 

अद्यतन मैं पता होना चाहिए - जॉन स्कीट कभी नहीं संदेह है। जिस समस्या को मैंने उपर्युक्त संदर्भित किया है वह तब होता है जब यह निर्धारित करना असंभव है कि कौन सी विधि अधिक विशिष्ट है। यहां एक परीक्षण केस है:

public class Test { 

    public void doSomething(String arg1, Object arg2) { 
    System.out.println("String, Object"); 
    } 

    public void doSomething(Object arg1, String arg2) { 
    System.out.println("Object, String"); 
    } 

    public static void main(String[] args) { 
    Test test = new Test(); 
    test.doSomething(null, null); 
    } 
} 

उपरोक्त एक कंपाइलर त्रुटि देगा।

+2

परीक्षण और वहां कोई कंपाइलर त्रुटि नहीं है। – JCasso

+0

@jcasso - मुझे "doSomething" लाइन पर एक कंपाइलर त्रुटि दिखाई देती है, जिसमें कहा गया है "मिले होड डूसमिंग (स्ट्रिंग, ऑब्जेक्ट) " – CPerkins

+2

@CPerkins" के लिए संदिग्ध है - हाँ, जेसीएसओ की टिप्पणी मेरी मूल (गलत) प्रतिक्रिया को संदर्भित करती है जहां मैंने कहा था कि 'showInputDialog()' एक कंपाइलर त्रुटि फेंक देगा जबकि यह नहीं होगा। – ChssPly76

12

आपके विशेष मामले में अधिक विशिष्ट विधि कहा जाएगा। सामान्य रूप से, हालांकि, कुछ ऐसे मामले हैं जहां विधि हस्ताक्षर संदिग्ध हो सकता है।निम्नलिखित पर विचार करें: इस मामले में

public class Main { 

    public static void main(String[] args) { 
     Main m = new Main(); 
     m.testNullArgument(null); 
    } 

    private void testNullArgument(Object o) 
    { 
     System.out.println("An Object was passed..."); 
    } 

    private void testNullArgument(Integer i) 
    { 
     System.out.println("An Integer was passed..."); 
    } 

    private void testNullArgument(String s) 
    { 
     System.out.println("A String was passed..."); 
    } 
} 

, संकलक विधि है कि एक पूर्णांक और विधि है कि एक स्ट्रिंग लेता है लेता है के बीच तय नहीं कर सकते। जब मैं उस, मैं

reference to testNullArgument is ambiguous, both method testNullArgument(java.lang.Integer) in testnullargument.Main and method testNullArgument(java.lang.String) in testnullargument.Main match 
+4

यह समझ में आता है। इंटीजर और स्ट्रिंग विशिष्टता के मामले में "बराबर" दोनों हैं जबकि ऑब्जेक्ट दोनों का अभिभावक है, इसलिए यह अधिक अस्पष्ट है। अब, यदि आपने स्ट्रिंग विधि को हटा दिया है, तो इंटीजर को कॉल किया जाएगा। –

+2

@ थॉमस: यह सही है। ऐसा लगता है कि इससे कोई फर्क नहीं पड़ता कि विरासत के पेड़ की विभिन्न शाखाएं कितनी दूर हैं, दो संदिग्ध वर्ग या तो हैं, क्योंकि स्ट्रिंग सीधे ऑब्जेक्ट को बढ़ाती है, जबकि इंटीजर संख्या बढ़ाती है। –

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