Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Java

जावा में वैरआर्ग्स में मेथड ओवरलोडिंग और अस्पष्टता

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

उदाहरण

public class Demo { 
    static void myFun(double... myVal) { 
        System.out.print("fun(double...): " + "आर्गुमेंट्स की संख्या: " + myVal.length); 
        for (double x : myVal) 
            System.out.print(x + " "); 
        System.out.println(); 
    } 
    
    static void myFun(boolean... myVal) { 
        System.out.print("fun(boolean...) " + "आर्गुमेंट्स की संख्या: " + myVal.length); 
        for (boolean x : myVal) 
            System.out.print(x + " "); 
        System.out.println(); 
    } 
    
    public static void main(String args[]) { 
        myFun(11.56, 34.78, 99.09, 56.66); 
        System.out.println("फंक्शन 1 सफलतापूर्वक कॉल हुआ"); 
        myFun(true, false, true, false); 
        System.out.println("फंक्शन 2 सफलतापूर्वक कॉल हुआ"); 
        myFun();  // अस्पष्टता! 
        System.out.println("फंक्शन 3 सफलतापूर्वक कॉल हुआ"); 
    } 
}

आउटपुट (कंपाइल त्रुटि)

Demo.java:23: error: reference to myFun is ambiguous
myFun();
^
both method myFun(double...) in Demo and method myFun(boolean...) in Demo match
1 error

व्याख्या: Demo क्लास 'myFun' नामक एक फंक्शन परिभाषित करती है जो वेरिएबल संख्या में फ्लोटिंग पॉइंट मान लेता है। मानों को 'for' लूप का उपयोग करके कंसोल पर प्रिंट किया जाता है। इस फंक्शन को ओवरलोड किया जाता है और पैरामीटर्स बूलियन मान होते हैं जो संख्या में भिन्न होते हैं। आउटपुट 'for' लूप का उपयोग करके कंसोल पर प्रदर्शित होता है।

मुख्य फंक्शन में, 'myFun' को पहले फ्लोटिंग पॉइंट मानों के साथ कॉल किया जाता है और फिर बूलियन मानों के साथ और फिर बिना किसी पैरामीटर के। इसके परिणामस्वरूप होने वाला अपवाद कंसोल पर प्रदर्शित होता है।

अस्पष्टता क्यों होती है?

जब myFun() को बिना आर्गुमेंट्स के कॉल किया जाता है, तो दोनों double... और boolean... शून्य आर्गुमेंट्स स्वीकार कर सकते हैं। कंपाइलर यह तय नहीं कर सकता कि कौन सा चुनना है।

समाधान:

// 1. स्पष्ट कास्ट
myFun((double[]) null);  // या new double[0]
myFun((boolean[]) null); // या new boolean[0]

// 2. अलग मेथड नाम
static void myFunDoubles(double... vals) { ... }
static void myFunBooleans(boolean... vals) { ... }

// 3. नॉन-वैरआर्ग्स ओवरलोड जोड़ें
static void myFun() { 
    System.out.println("कोई आर्गुमेंट नहीं"); 
}

वैरआर्ग्स नियम:

  • एक मेथड में केवल एक वैरआर्ग्स पैरामीटर हो सकता है
  • वैरआर्ग्स अंतिम पैरामीटर होना चाहिए
  • वैरआर्ग्स ओवरलोडिंग सावधानी से करें
  • वैरआर्ग्स को सरणी के रूप में माना जाता है
  1. - Java में Method Overloading बनाम Method Overriding

    मेथड ओवरलोडिंग कंपाइल-टाइम पॉलीमॉर्फिज्म का एक प्रकार है जबकि मेथड ओवरराइडिंग रनटाइम पॉलीमॉर्फिज्म का एक प्रकार है।मेथड ओवरलोडिंग कोड पठनीयता बढ़ाता है जबकि मेथड ओवरराइडिंग सुपरक्लास में मौजूद मेथड को प्रतिस्थापित करने के लिए सबक्लास में मेथड का विशिष्ट कार्यान्वयन प्रदान करता है।मेथड ओवरलोडिंग एक क

  1. - Java में Method Overloading और Type Promotion

    मेथड ओवरलोडिंग समान नाम वाले कई मेथड्स बनाने में मदद करता है ताकि विभिन्न प्रकार के पैरामीटर्स पर समान क्रिया की जा सके।हम टाइप प्रमोशन का उपयोग तब कर सकते हैं जब वेरिएबल्स समान प्रकार के हों। टाइप प्रमोशन स्वचालित रूप से निचली रेंज के मान को उच्च रेंज के मान में प्रमोट करता है। उदाहरण के लिए, byte

  1. - Java में Method Overloading

    मेथड ओवरलोडिंग स्टैटिक पॉलीमॉर्फिज्म का एक प्रकार है। मेथड ओवरलोडिंग में, हम समान नाम लेकिन अलग पैरामीटर्स वाले कई मेथड्स को परिभाषित कर सकते हैं। निम्नलिखित उदाहरण प्रोग्राम पर विचार करें।उदाहरणpublic class Tester { public static void main(String args[]) { Tester tester = new Tester()