2017-02-05 12 views
7

यह सवाल Java overload confusionविधि से अधिक भार: एकल पैरामीटर बनाम बारी मापदंडों

मैं एक किताब पढ़ रहा हूँ और वहाँ अधिक भार है जहाँ से एक संकलक विधि बुलाया जा रहा है हल करने में सक्षम नहीं हो सकता है विधि के संबंध में एक विषय है के समान हो सकता है। पुस्तक पर उदाहरण दो पैरामीटर (int, double) और (double, int) के साथ ओवरलोडेड विधि का उपयोग करता है। इस विधि को कॉल करने जैसे ओवरलोडेड ट्वॉपरम (4, 5) एक कंपाइलर त्रुटि का कारण बनेंगे क्योंकि int को डबल तक पारित किया जा सकता है। मेरा सवाल यह है कि क्यों संकलक हल करने में सक्षम है कि कौन सा तरीका कॉल किया जाएगा यदि मेरा पैरामीटर केवल एक है?

public class Test { 

    public static void main(String[] args) { 
     Test t = new Test(); 
     t.overloadedSingleParam(1); //this is working 
     t.overloadedTwoParam(4, 5); //this is NOT working 
    } 

    void overloadedSingleParam(double a) { 
     // do something here.. 
    } 

    void overloadedSingleParam(int a) { 
     // do something here.. 
    } 

    void overloadedTwoParam(double a, int b) { 
     // do something here.. 
    } 

    void overloadedTwoParam(int a, double b) { 
     // do something here.. 
    } 
} 
+0

क्या आपका प्रश्न पहले से ही जुड़े हुए उत्तर में उत्तर नहीं दिया गया है? – CKing

+0

आपके पास एक विधि है जो एक 'int' पैरामीटर लेती है। –

+0

@jackjay हाँ, लेकिन int को दोहरे पैरामीटर में पारित किया जा सकता है, जावा अभी भी इसे हल करने में सक्षम क्यों है? – fuzzy28

उत्तर

2

सीकेइंग अंतर्ज्ञान और उत्तर अच्छा है।
मैं जेएलएस संदर्भ के साथ पूरा करूँगा।

सामान्य विचार यह है: संकलक सबसे विशिष्ट विधि चुनता है ... यदि उसे मिल जाता है।

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

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


पहले परिदृश्य में के रूप में आप एक अद्वितीय अधिकतम विशिष्ट विधि है संकलन ठीक है: के रूप में हम विधि और प्रभावी पैरामीटर का औपचारिक पैरामीटर के रूप में दोनों int है

Test t = new Test(); 
t.overloadedSingleParam(1); 

... 
void overloadedSingleParam(double a) { 
    // do something here.. 
} 
void overloadedSingleParam(int a) { 
    // do something here.. 
} 

void overloadedSingleParam(int a) एक सटीक मिलान है ।
जबकि overloadedSingleParam(double a) को int से double पर एक अंतर्निहित रूपांतरण की आवश्यकता है।

तो overloadedSingleParam(double a)void overloadedSingleParam(int a) से कम विशिष्ट है जब int मान तर्क के रूप में पारित किया जाता है।
तो कंपाइलर void overloadedSingleParam(int a) चुनता है और संकलन सफल होता है।


दूसरा परिदृश्य में, बातें अलग हैं:

Test t = new Test(); 
t.overloadedTwoParam(4, 5); 

... 
void overloadedTwoParam(double a, int b) { 
    // do something here.. 
} 

void overloadedTwoParam(int a, double b) { 
    // do something here.. 
} 

आप अनौपचारिक अंतर्ज्ञान के साथ यह जाँच कर सकते हैं:

आप कोई भी विधि के मामले में गिर जाते हैं एक और एक से अधिक विशिष्ट है
  • overloadedTwoParam((double)3, 4)void overloadedTwoParam(int a, double b) पर लागू नहीं किया गया है।

  • void overloadedTwoParam(double a, int b) पर लागू या तो संकलित नहीं करता है।

परिणामस्वरूप एक संकलन त्रुटि होती है।

7

मेरे यहाँ सवाल क्यों संकलक को हल करने कौन सी विधि बुलाया जाएगा अगर मेरे पैरामीटर केवल एक

है यह एक एकल पैरामीटर की बात आती है में सक्षम, संकलक कि देखने के लिए सक्षम है एक ऐसी विधि है जो int लेती है, इसलिए इस बारे में कोई भ्रम नहीं है कि किस विधि को बुलाया जाना चाहिए। यहां तक ​​कि यदि आप एक विधि को हटाते हैं जो एक int लेता है, तो संकलक अभी भी उस विधि को कॉल करने में सक्षम होगा जो एक double लेता है क्योंकि यहां कोई अस्पष्टता नहीं है।

(int एक double के लिए प्रोत्साहित किया जा सकता है) यह अन्य तरीकों कि int और double मापदंडों वैकल्पिक की बात आती है, संकलक एक double या दूसरे के लिए पहले पैरामीटर बढ़ावा देने के लिए है कि क्या तय करने के लिए जिम्मेदारी लेने के लिए नहीं चाहता है double पर पैरामीटर।

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