2013-07-16 3 views
29

स्रोत क्यों मिलता हैमैं एक संकलन चेतावनी यहाँ (जावा में वर आर्ग विधि कॉल)

javac TestVarArgs.java 

त्रुटि:

TestVarArgs.java:15: warning: non-varargs call of varargs method with inexact argument type for last parameter; 
cast to java.lang.Object for a varargs call 
cast to java.lang.Object[] for a non-varargs call and to suppress this warning  
tva.varArgsMethod(args);  
^ 

1 warning 

मैं javac 1.6.0_20 उपयोग कर रहा हूँ और कोड ओ/पी इंगित करता है कि एक गैर var arg कॉल वैसे भी बनाया गया था।

+0

@downvoter कृपया टिप्पणी करने की परवाह करें। वैसे भी मैंने इसे संतुलित किया है: डी – Freak

उत्तर

45

ऐसा इसलिए है क्योंकि String[] और Object... बिल्कुल मेल नहीं खाते हैं।

आप या Object (यदि आप स्ट्रिंग्स अलग पैरामीटर के रूप में पास करना चाहते हैं) पहली (यदि आप सिर्फ एक तर्क यह है कि एक सरणी है चाहते हैं) या तो Object[] को String[] कास्ट करने के लिए किया है।

tva.varArgsMethod((Object[])args); // you probably want that 

tva.varArgsMethod((Object) args); // you probably don't want that, but who knows? 

यह चेतावनी क्यों है और कोई त्रुटि नहीं है? पिछेड़ी संगतता। Varargs की शुरूआत से पहले, आप इन विधियों को Object[] लेते थे और इसके खिलाफ संकलित कोड अभी भी वैसे ही काम करना चाहिए जब विधि varargs का उपयोग करने के लिए अपग्रेड किया गया हो। जेडीके मानक पुस्तकालय इस तरह के मामलों से भरा है। उदाहरण के लिए java.util.Arrays.asList(Object[]) जावा 5 में java.util.Arrays.asList(Object...) में बदल गया है और इसका उपयोग करने वाले सभी पुराने कोड को अभी भी संकलन और संशोधनों के बिना काम करना चाहिए।

+0

दाएं, लेकिन संकलक किसी भी स्ट्रिंग [] 'को पार करके किसी भी प्रकार के गैर वर्गा विधि कॉल को चुनता है। वह ऐसा क्यों करता है? क्या उसके आस-पास कोई नियम है? इसमें 'ऑब्जेक्ट [] {स्ट्रिंग []}' भेजकर भी एक var arg कॉल करने का विकल्प था। नहीं ? – abc

+1

अच्छा, लेकिन यह अस्पष्ट है, इसलिए आप स्पष्ट होना और चेतावनी से बचना चाहते हैं। – Thilo

0

रूप

public void varArgsMethod(String ... arr) 
+0

यही कारण है कि उसे त्रुटि मिल रही है। –

+0

विधि को कॉल करते समय उसे वांछित पैरामीटर डालने की आवश्यकता है। –

1

प्रकार String[] का तर्क स्पष्ट प्रकार TestVarArgs से varargs विधि varArgsMethod(Object...) के आह्वान के लिए Object[] लिए डाली जानी चाहिए विधि को संशोधित करें। String[]
को
या
परिवर्तन विधि के पैरामीटर: यह वैकल्पिक रूप से एक varargs मंगलाचरण के लिए वस्तु को
आप इसे जिस तरह से दोनों में से किसी एक करके ठीक कर सकते हैं आप String[]Object[] को (tva.varArgsMethod((Object[])args); रेफरी) डाली तो डाली जा सकता है (संदर्भ: public void varArgsMethod(String ... paramArr))

+0

आप इस बारे में स्पष्ट होना चाहते हैं। यदि यह ऑब्जेक्ट में डाला गया है [] यह एक गैर var args invocation होगा। – abc

+1

@abc कृपया शब्दों पर ध्यान दें। 'प्रकार स्ट्रिंग [] का तर्क स्पष्ट रूप से varrs विधि varArgsMethod (ऑब्जेक्ट ...' के '** 'आमंत्रण के लिए ऑब्जेक्ट [] पर डाला जाना चाहिए) '** और दूसरी पंक्ति 'इसे वैकल्पिक रूप से' ** 'varargs invocation' के लिए ऑब्जेक्ट में डाला जा सकता है ** तो पहले मैंने केवल विधि आमंत्रण के लिए कहा था और दूसरी बार मैंने varargs आमंत्रण के लिए कहा था। लेकिन मैं आपसे सहमत हूं मेरे खिलाफ कि मुझे इसे और अधिक सटीक समझा जाना चाहिए;) – Freak

+0

अच्छा, सुधार के लिए उपयुक्त होने के लिए धन्यवाद;) – abc

0

सुरुचिपूर्ण तरीके से इस चेतावनी को बंद छुटकारा पाने के लिए: के बजाय tva.varArgsMethod(args) कॉल tva.varArgsMethod(Arrays.stream(args).toArray()) पूर्व स्पष्ट रूप से दिखा रहा है कि आप कई तर्क पारित करते हैं।

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