2011-10-02 26 views
8

मैं निम्नलिखित कोड का टुकड़ा से संबंधित एक प्रश्न है:जावा मुद्दा

class VarArgsTricky { 
    static void wide_vararg(long... x) { 
     System.out.println("long..."); 
    } 

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

    public static void main(String[] args) { 
     int i = 5; 
     wide_vararg(i, i, i); // needs to widen and use var-args 
     Long l = 9000000000l; 
     wide_vararg(l, l); // prints sucessfully "long..." 
    } 
} 

wide_vararg करने के लिए पहली कॉल के विफल होने (कह रही है कि विधि ambigous है), जबकि दूसरी बस संकलित संकलित करने के लिए ठीक।

इस व्यवहार के बारे में कोई स्पष्टीकरण? धन्यवाद!

+0

यदि यह ओवरलोडिंग के बारे में सिर्फ एक प्रयोग नहीं है, तो कृपया प्रभावी जावा एसई: आइटम 41 को समझदारी से ओवरलोडिंग का उपयोग करें। – TJR

+0

ओसीपीजेपी प्रमाणन परीक्षा के लिए एक संभावित प्रश्न सुलझाने के लिए यह पूरी तरह से एक प्रयोग था। –

उत्तर

1

जब एक var-arg विधि लागू की जाती है, पैरामीटर संकलित समय पर उस प्रकार की सरणी में परिवर्तित हो जाते हैं।

पहली कॉल में, पैरामीटर एक int [] में परिवर्तित हो जाते हैं। चूंकि जावा में सभी सरणी ऑब्जेक्ट क्लास के प्रत्यक्ष उप प्रकार हैं, आदिम चौड़ाई की अवधारणा उस स्थिति में लागू नहीं होती है, दोनों अधिभार समान रूप से लागू होते हैं क्योंकि लंबे [] और इंटीजर [] एक ही स्तर पर होते हैं। इसलिए अस्पष्टता

10

पहले wide_vararg कॉल अस्पष्ट है क्योंकि संकलक या तो सकता है:

  • long रों को चौड़ा int है, और फोन पहले wide_vararg विधि, या
  • को autobox int रों Integer एस, और दूसरे wide_vararg पर कॉल करें।

यह पता नहीं है जो यह चाहिए करते हैं, हालांकि, तो यह अस्पष्ट विधि कॉल संकलित करने के लिए मना कर दिया। यदि आप संकलित करने के लिए पहला कॉल चाहते हैं, तो i को Integer या long के रूप में घोषित करें, int पर नहीं।

+1

के एंड बी एससीजेपी के मुताबिक 6 पुस्तक चौड़ा मुक्केबाजी धड़कता है जबकि मुक्केबाजी अलग-अलग धड़कता है। तो पहले कॉल को ऑटोबॉक्स के बजाए चौड़ा करना चुनना चाहिए। अगर मुझे इंटीजर के रूप में घोषित किया गया है तो यह संकलित नहीं होता है। बेशक, लंबे काम करता है। प्रश्न अभी भी बना हुआ है: यह ऑटोबॉक्सिंग पर विस्तार क्यों नहीं करता है? –

+0

एचएम, आप सही हैं। मुझे अभी तक यकीन नहीं है क्यों। बिल्ली, यह एक कंपाइलर बग हो सकता है। चौराहे या मुक्केबाजी से भिन्नता को पीटा जाता है या नहीं, हालांकि, गैर-भिन्नता विकल्प नहीं है, हालांकि, कोई गैर-भिन्नता विकल्प नहीं है। –

+1

कोई गैर-varargs विकल्प नहीं है, यह सच है। यह कुछ प्रकार की कंपाइलर बग या कुछ खराब ज्ञात सुविधा हो सकती है। वास्तव में जानना दिलचस्प होगा। –

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