जावा में वेरिएबल आर्गुमेंट्स का उपयोग करते समय अस्पष्टताएं होती हैं। ऐसा इसलिए होता है क्योंकि दो मेथड्स निश्चित रूप से डेटा मानों द्वारा कॉल किए जाने के लिए पर्याप्त वैध हो सकते हैं। इसके कारण, कंपाइलर को यह ज्ञान नहीं होता कि किस मेथड को कॉल करना है।
उदाहरण
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("कोई आर्गुमेंट नहीं");
}
वैरआर्ग्स नियम:
- एक मेथड में केवल एक वैरआर्ग्स पैरामीटर हो सकता है
- वैरआर्ग्स अंतिम पैरामीटर होना चाहिए
- वैरआर्ग्स ओवरलोडिंग सावधानी से करें
- वैरआर्ग्स को सरणी के रूप में माना जाता है