2014-04-29 7 views
5

में अधिक भार वर आर्ग विधि और आवरण तरीकों मैं निम्नलिखित कोड संकलन करने की कोशिश की लेकिन त्रुटिअस्पष्टता त्रुटि जावा

static void test(long... x) 
{ 
    System.out.println("long..."); 
} 

static void test(Integer... x) 
{ 
    System.out.println("Integer..."); 
} 

public static void main(String [] args) { 
    int no=5; 
    test(no,no);//getting error at this point in eclipse 'The method test(long[]) is ambiguous ' 
} 

मुझे पता है क्यों यह अस्पष्ट है donot मिले, जबकि। इसका मतलब है कि अगर मैं int मान पास कर रहा हूं तो इसे ऑटो-बॉक्स और test(Integer..x) कहला जाना चाहिए .. इसी तरह की लाइन test(long..x) को कॉल किया जाना चाहिए..यह मेरी समझ है..क्या कोई इसे समझा सकता है कि यह संदिग्ध क्यों है? एक और इसलिए यह के लिए संकलक तय करने के लिए छोड़ दिया जाता है Integer के साथ अन्य long साथ परिभाषित किया गया है -

+0

आप जिस जेडीके संस्करण का उपयोग कर रहे हैं वह क्या है? और क्या होता है यदि आप इसे कमांड लाइन से संकलित करते हैं? कृपया जांचें कि क्या आपको इसकाट नहीं है: http://stackoverflow.com/a/7689819/2231632 – prabugp

उत्तर

2

चर arity सबसे विशिष्ट विधि का निर्धारण करने में पिछले आता है करने के लिए मुक्केबाजी के रूप में समान रूप से मान्य है। नियम निर्धारित करने के लिए जो vararg विधि लागू होता है जब वहाँ कई JLS 15.12.2.4 में परिभाषित कर रहे हैं कर रहे हैं - यहाँ एक उद्धरण है:

एक चर arity सदस्य विधि नामित मीटर में एक ही नाम है, तो का एक और चर arity सदस्य विधि की तुलना में अधिक विशिष्ट है या तो:

  • [...]
  • एक सदस्य विधि कश्मीर पैरामीटर और अन्य n मानकों, जहां n ≥ कश्मीर, और है:

पहली विधि के पैरामीटर के प्रकार यू 1, ..., यूके -1, ब्रिटेन [] हैं। अन्य विधि के पैरामीटर के प्रकार टी 1, ..., टीएन -1, टीएन [] हैं। सभी जे से 1 से एन तक, यूजे <: टीजे आपके मामले में, के = एन, और यू 1 [] = int [] और टी 1 [] = लम्बा [] इसलिए अगर < पर दृढ़ संकल्प किया जा सकता है: लंबा या विलोम।

दूसरे शब्दों में, खाते में लिया गया प्रकार int [] बनाम लंबा नहीं है [] लेकिन int बनाम लंबा है। और ऐसा होता है कि int <: लंबे समय तक int ... विधि चुना जाना चाहिए और इसे संकलित करना चाहिए।


निष्कर्ष:

कोड होना चाहिए (और है) जावा 7 के साथ ठीक संकलन लेकिन जावा 5 या 6 के साथ संकलन नहीं होगा प्रिंट नीचे कोड जावा 7 के साथ int:

public class Test1 { 
    public static void main(String[] args) { 
     new Test1().m(1, 2); 
    } 
    int m(int... i) { 
     System.out.println("int"); 
     return 0; 
    } 
    long m(long... i) { 
     System.out.println("long"); 
     return 0; 
    } 
} 
+0

'एम (इंटीजर ... i)' के बारे में क्या है जो ओपी के प्रश्न में है ?? [वह पूरा नहीं होगा ...] (http://ideone.com/JTrTYq) और [यहां कारण है।] (Http://stackoverflow.com/a/23364636/1686291) –

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