2015-11-01 3 views
11

मुझे पता है कि जावा "..." सरणी तर्क वाक्यविन्यास पैरामीटर को सरणी के रूप में प्राप्त कर सकता है, या विधि में पास किए गए कई पैरामीटर। हालांकि, मैंने देखा है कि यह भी संग्रह के लिए ऐसा नहीं करता है:जावा स्वचालित रूप से संग्रह को Arguments arrays में परिवर्तित कर रहा है?

public static void main(String[] args) { 
    Collection<Object> objects = new ArrayList<>(); 
    test(objects); 
} 

public static void test (Object...objects) { 
    System.out.println("no compile errors"); 
} 

यह संकलित करता है तथा मेरे बिना toArray() विधि कॉल करने की आवश्यकता होगी, चलाता है। दृश्य के पीछे क्या हो रहा है? क्या इस वाक्यविन्यास के लिए इस "ऑटो-रूपांतरण" के अतिरिक्त तरीके हैं?

बीटीडब्ल्यू, मैं जावा 1.7 का उपयोग कर रहा हूं।

उत्तर

12

यह संग्रह को एक सरणी में परिवर्तित नहीं करता है। यह स्वयं संग्रह को पहले vararg तर्क के रूप में पास करता है। इस प्रकार परीक्षण विधि को एक तत्व की सरणी प्राप्त होती है, और यह तत्व ArrayList है।

यह

System.out.println(Arrays.toString(objects); 

द्वारा या एक डिबगर का उपयोग करके

System.out.println("no compile errors"); 

की जगह आसानी से पाया जा सकता है।

4

एक Collection<Object> भी एक Object है तो जब आप

Collection<Object> objects = new ArrayList<>(); 
test(objects); 

यह एक एकल पैरामीटर है कि अपने संग्रह है सक्रिय किया जाएगा साथ test आह्वान: विधि एक सरणी एक भी तत्व होने प्राप्त होगा।

4

यहां क्या हो रहा है यह है कि विधि को लंबाई 1 की एक सरणी प्राप्त होती है जिसमें एक Collection होता है।

अधिकांश समय, हस्ताक्षर

method(Object... objs) 

, बचा जाना चाहिए के रूप में यह स्वीकार करेंगे पैरामीटर के किसी भी अनुक्रम, यहां तक ​​कि पुरातन इन ऑटो बॉक्सिंग प्राप्त ना हो।

+0

धन्यवाद। इस तरह से इस तरह से नहीं सोचा था ... – Ozilophile

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