2010-11-06 11 views
6

मैं निम्नलिखित हस्ताक्षर के साथ एक विधि है: इन कॉल के सभीकॉलिंग varargs विधि तत्वों और तत्वों की सरणी मिश्रण काम नहीं करता है

public void foo(String... params); 

तो मान्य हैं:

foo("Peter", "John"); 
foo(new String[] { "Peter", "John" }); 

लेकिन ऐसा क्यों है एक वैध नहीं है?

foo("Peter", new String[] { "John" }); 

उत्तर

8

docs से:

अंतिम पैरामीटर के प्रकार के बाद तीन अवधियों संकेत मिलता है कि अंतिम तर्क एक सरणी या तर्कों के एक दृश्य के रूप में के रूप में पारित किया जा सकता है।

आप एक तर्क और एक सरणी पारित नहीं कर सकते हैं।

+2

और यह एक अच्छी बात है जिसे आप नहीं कर सकते हैं। जावा 5 के बाद से विधियों को हल करने के नियम पहले से ही बहुत मुश्किल हो गए हैं जब ऑटोबॉक्सिंग, वैरगास और सरणी खेल में आती हैं। – Thilo

2

ऐसा इसलिए है क्योंकि वास्तव में आप स्ट्रिंग और एक अन्य ऐरे युक्त ऐरे को पारित करने का प्रयास करते हैं।

0

क्योंकि यह वही बात नहीं है। आप बस इस तरह मिश्रण और मिलान नहीं कर सकते हैं। अपने उदाहरण में अमान्य एक इस तरह एक समारोह हस्ताक्षर के साथ काम करेगा:

public void foo(String head, String ... tail) 
0

इस विधि

public void foo(String... params); 

इस एक का केवल एक सुविधा संस्करण है:

public void foo(String[] params); 

और तुम इसलिए इसे स्ट्रिंग्स की एक चर संख्या के साथ कॉल कर सकते हैं (जिसे कंपाइलर द्वारा स्ट्रिंग सरणी में परिवर्तित किया जाएगा) या एक स्ट्रिंग सरणी, लेकिन एक संयोजन डिज़ाइन द्वारा काम नहीं करेगा।

0

इसके बारे में सोचें। आप इस तरह से एक विधि था क्या होगा यदि:

public void foo(Object... objects); 

और यह इस तरह कॉल करने की कोशिश:

foo("bar", new Object[] { "baz" }); 

दूसरे स्थान पर Object[] varargs कॉल में एक भी Object या होना चाहिए के रूप में व्यवहार किया जाना चाहिए यह "विस्तारित" हो सकता है? यह बहुत भ्रमित व्यवहार का कारण बन जाएगा।

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