7

निम्नलिखित प्रोग्राम अपवाद क्यों फेंकता है?एससीजेपी प्रश्न: जावा-विधि var-args के साथ ओवरलोडिंग। तर्क क्या है?

public class MainClass{ 
    public static void main(String[] argv){ 
     callMethod(2); 
    } 
    public static void callMethod(Integer... i){ 
     System.out.println("Wrapper"); 
    } 
    public static void callMethod(int... i){ 
     System.out.println("Primitive"); 
    } 

}

विधि callMethod (पूर्णांक []) प्रकार MainClass के लिए अस्पष्ट

ठीक है, मैं देख सकता है कि दो किसी भी विधि का काम करेंगे (अगर अन्य टिप्पणी की गई है), लेकिन मुझे यह भी पता है कि क्या होता है यदि कोई आदिम विधि के इनपुट के प्रकार से बिल्कुल मेल नहीं खाता है तो क्या होता है।

पहली चीज जो कि कोशिश की जाती है वह आदिम को चौड़ा करना है।

 public static void callMethod(long i){ 
     System.out.println("long"); 
     } 

कोड प्रिंट होगा लंबे

दूसरी बात आदिम बॉक्स करने के लिए है: तो, अगर वहाँ एक तिहाई तरीका था। तो अगर एक इंटीजर लेने का कोई तरीका था, तो वह एक होगा।

तीसरी प्राथमिकता var-args है।

उपर्युक्त प्राथमिकता के आधार पर, मैं उम्मीद करता हूं कि दूसरा ईमानदारी मामला होगा। मैं उम्मीद करता हूं कि int को इंटीजर में लपेटा जाए और (इंटीजर ...) का आह्वान किया जाएगा। लेकिन निश्चित रूप से ऐसा नहीं होता है। इसके बजाय, अपवाद फेंक दिया जाता है।

क्या कोई यह देखता है और समझा सकता है कि इस उदाहरण में प्राथमिकता क्यों लागू नहीं होती है?

चीयर्स!

उत्तर

9

आप सही हैं कि मुक्केबाजी मुक्केबाजी से पहले आता है, जो बदले में var-args से पहले आता है।

लेकिन आप callMethod(Integer i) के रूप में पहली विधि का इलाज कर रहे हैं, callMethod(Integer... i) नहीं। चूंकि दोनों विधियां var-args का उपयोग करती हैं, इसलिए टाई प्राथमिकता है। यही है, न तो अकेले मुक्केबाजी के मानदंडों को पूरा करता है, लेकिन दोनों अलग-अलग तर्कों के मानदंडों को पूरा करते हैं।

याद रखें कि विस्तृत करना अवैध है, फिर बॉक्स (हालांकि मैंने इस उत्तर को पोस्ट करने से पहले कुछ शोध किया था और पाया कि यह बॉक्स के लिए कानूनी है, फिर विस्तृत करें)। इसी प्रकार, आपको बॉक्स नहीं मिलेगा, फिर var-args व्यवहार; कंपाइलर var-args चरण के लिए सही छोड़ देता है और दो विधियों को देखता है जो var-args लेते हैं।

संपादित करें: मुझे यह स्पष्ट करना चाहिए कि यदि कोई अस्पष्टता नहीं है तो आपको बॉक्स-फिर-var-args व्यवहार प्राप्त होगा। दूसरे शब्दों में, यदि केवल एक callMethod() था, और इसमें Integer... i लिया गया, तो आपको "Wrapper" मिलेगा।

+0

मैंने सोचा कि यह तीन दृष्टिकोणों की कोशिश करता है और पहला "अनावश्यक" होने का प्रयास किया जाएगा। यद्यपि विधि लेती है (इंटीजर ... i), मुझे उम्मीद है कि एक इंटीजर में मुक्केबाजी उस विधि को "अयोग्य" बनाती है। लेकिन, जैसा कि आप कहते हैं, ऐसा लगता है कि बाद में "var-arg-ization" को भी ध्यान में रखा जाता है। चीयर्स! –

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