2016-01-01 7 views
5

प्रकार के लिए विधि अस्पष्ट है, मैं यह समझने की कोशिश कर रहा हूं कि जावा में ओवरलोडिंग कैसे काम करती है और विभिन्न ओवरलोडिंग नियमों को समझने की कोशिश कर रहा है जो जावा में चौड़ा, ऑटोबॉक्सिंग और वैरगास के मामले में लागू होते हैं। मैं समझने के लिए इस परिदृश्य में हो रहा है नहीं पा रहा हूँ:विधि

package package1; 

public class JustAClass { 
    public static void add(int a, long b) { 
     System.out.println("all primitives"); 
    } 

    //public static void add(Integer a, long b) { 
    //  System.out.println("Wraper int, primitive long"); 
    //} 

    public static void add(int a, Long b) { 
     System.out.println("Primitive int, Wrapper long"); 
    } 

    public static void add(Integer a, Long b){ 
     System.out.println("All wrapper"); 
    } 

    public static void main(String[] args) { 
     int a = 10; 
     Integer b = 10; 
     long c = 9; 
     Long d = 9l; 

     add(a,c); 
     add(a,d); 
     add(b,c); 
     add(b,d); 
} 

} 

इस बिंदु पर, मैं add विधि The method is ambiguous for the type Error कह के तीसरे मंगलाचरण पर एक संकलन त्रुटि मिलती है। ऐसा क्यों है? यह निर्धारित करने के लिए नियम क्या हैं कि विधि का कौन सा आवेषण कार्य करेगा? निम्नलिखित मामले में वास्तव में क्या हो रहा है? मुझे लगता है कि fourth ओवरलोडेड ऐड विधि काम करनी चाहिए। कृपया इसके पीछे की अवधारणा को समझने में मेरी सहायता करें।

+1

नियम जावा भाषा विनिर्देशों में हैं, और वे बहुत लंबे और जटिल हैं। उन्हें याद रखना मूल रूप से असंभव है, और यही कारण है कि आपको कभी भी ऊपर की तरह कोड लिखना नहीं चाहिए, क्योंकि आप बग पेश करने के लिए लगभग निश्चित हो सकते हैं। मैं समझने की आपकी इच्छा का सम्मान करता हूं, लेकिन ऐसा करने के लिए, आपको जेएलएस पढ़ना चाहिए: http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12 –

+0

@JBNizet : मुझे लगता है कि सवाल पूरी तरह से कानूनी है। आप इसे तोड़कर विनिर्देश सीख सकते हैं और समझ सकते हैं कि यह क्यों टूटता है, फिर इसे फिर से न करें। – kiltek

उत्तर

6

विधि अधिभार समाधान के लिए 3 चरण हैं। पहला चरण ऑटो-मुक्केबाजी/अनबॉक्सिंग नहीं करता है, जिसका अर्थ है कि add के ओवरलोडेड संस्करणों में से किसी एक से मिलान करने के लिए पास पैरामीटर के मुक्केबाजी/अनबॉक्सिंग की आवश्यकता होती है, केवल तभी माना जाएगा जब कोई मिलान नहीं मिला है जिसके लिए आवश्यकता नहीं है मुक्केबाजी/unboxing। यही कारण है कि आपकी 3 कॉल, जिनमें एक सटीक मिलान है, काम करते हैं। add(b,c); के बारे में, नीचे देखें कि यह अस्पष्ट क्यों है।

add(a,c); // exact match to add(int a, long b) 
    add(a,d); // exact match to add(int a, Long b) 
    add(b,c); // there is no exact match, so at least one of the passed parameters must 
      // be boxed or unboxed. However, by unboxing b to int or boxing 
      // c to Long, each of the three add methods can match, and the 
      // compiler doesn't know which one to prefer 
    add(b,d); // exact match to add(Integer a, Long b) 
+0

@ नीरजडोरल मेरा मतलब सिर्फ एक नहीं था, मेरा मतलब कम से कम एक था। शायद मुझे फिर से वाक्यांश करना चाहिए। – Eran

+0

धन्यवाद, बिंदु प्राप्त करें – neerajdorle