2011-08-01 15 views
41

मेरे जावा कोड में मैं अक्सर बहुत आसान method(Class... args) varargs का उपयोग करता हूं। जहां तक ​​मुझे पता है, वे आपको Class ऑब्जेक्ट्स या Class[] की सरणी पास करने की अनुमति देते हैं। चूंकि मैं अक्सर जावा संग्रह कक्षाओं का उपयोग करता हूं, इसलिए मैं दोनों के बीच संगतता की कमी से निराश हूं। नतीजतन, मैं collection.toArray() कर रहा हूं, लेकिन इसमें कुछ प्रकार के सुरक्षा मुद्दे हैं।जावा varargs समर्थन संग्रह क्यों नहीं करता है?

तो अब सवाल के लिए: क्यों जावा Iterable<T> के उदाहरणों को vararg तर्क के रूप में अनुमति नहीं देता है, जब तक कि सामान्य प्रकार T... vararg के प्रकार को फिट करता है? क्या हर कोई सूचियों, सेट इत्यादि का हर समय उपयोग नहीं करता है? संग्रह से vararg में रूपांतरण प्रदान करने के लिए कोई आसान, प्रकार-सुरक्षित तरीका है?

उत्तर

48

कारण सरल है: एक परिवर्तनीय धैर्य पैरामीटर बस कुछ पुराने मेटाडाटा के साथ एक पुराना स्कूल सरणी पैरामीटर है जो संकलक को कुछ वाक्य रचनात्मक चीनी प्रदान करने के लिए कहता है (यानी, यह अंतर्निहित सरणी निर्माण की अनुमति देता है)।

इसलिए JVM Object... के परिप्रेक्ष्य से Object[] जैसा ही है। संग्रहों को अनुमति देने के लिए JVM में अधिक आक्रामक परिवर्तन की आवश्यकता होगी (जिसमें संग्रह के लिए कोई स्पष्ट समर्थन नहीं है)।

ध्यान दें कि आप दोनों तरीकों से समर्थन करने के लिए, तो बनाने संग्रह आधारित पद्धति शायद बेहतर तरीका है चाहते हैं:

public void frobnicate(Object... args) { 
    frobnicate(Arrays.asList(args)); 
} 

public void frobnicate(Iterable<Object> args) { 
    // do stuff 
} 

इस का कारण यह है कि Arrays.asList() का उपयोग कर आमतौर पर की तुलना में एक सस्ता आपरेशन है Collection.toArray() (क्योंकि यह एक साधारण आवरण बनाता है)।

+0

यह तकनीकी दृष्टि से प्रश्न का उत्तर देता है, लेकिन एक डेवलपर के रूप में, मुझे अभी भी लगता है कि जब भी मैं संग्रह और सादा वस्तुओं दोनों का उपयोग करना चाहता हूं तो एक सहायक विधि की आपूर्ति करना मूर्खतापूर्ण है। बेशक, तथ्य यह है कि हमारे पास संग्रह और varargs कुछ साल पहले की तुलना में पहले ही राहत है। – tb189

+3

@ द एलिट जेंटलमैन: मैं बस एक साधारण 'foo' पर' frobnicate' का उपयोग करना पसंद करता हूं। [स्रोत] (http://www.catb.org/jargon/html/F/frobnicate.html)। –

+0

@ tb189: क्यों एक "सहायक विधि"? आप दो अलग-अलग, टाइप-वार असंबद्ध प्रकार के तर्क स्वीकार करने के लिए एक विधि चाहते हैं। यह * बिल्कुल * समस्या है जो ओवरलोडिंग को संभालने के लिए डिज़ाइन किया गया है। –

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