2013-10-15 7 views
5

List.toArray() जेनेरिक क्यों नहीं है? आपको इस प्रकार को तर्क के रूप में क्यों देना चाहिए (और आमतौर पर एक नया खाली उदाहरण बनाते हैं)?List.toArray() जेनेरिक क्यों नहीं है?

public Object[] toArray() 

http://docs.oracle.com/javase/7/docs/api/java/util/List.html#toArray()


अद्यतन: मैं के बाद से सीखा है कि सामान्य सरणी निर्माण की अनुमति नहीं है, लेकिन मुझे विश्वास है कि यह होना चाहिए। क्या कोई कारण है कि इसकी अनुमति नहीं है?

Main.java:28: error: generic array creation 
     T[] ret = new T[size()]; 

http://ideone.com/3nX0cz


अद्यतन: ठीक है, मैं विश्वास है कि यह जवाब है: क्योंकि

http://docs.oracle.com/javase/tutorial/java/generics/restrictions.html#createArrays

नहीं यह सीधे प्रासंगिक है, लेकिन परोक्ष रूप से प्रासंगिक है। new T[size()] के साथ स्वाभाविक रूप से गलत कुछ भी नहीं है, जहां MyList<String>new String[size()] में बदल दिया जाएगा, लेकिन टी स्वयं पैरामीटरयुक्त प्रकार हो सकता है। तो यदि आप MyList<Set<Integer>> बनाना चाहते थे, तो TSet<Integer> के बराबर होगा और संकलक new Set<Integer>[size()] बनाने का प्रयास करेगा, जो लौटने पर लिंक में समस्या का कारण बन सकता है। किसी ने इन पंक्तियों के साथ जवाब देने का प्रयास किया लेकिन उस उत्तर को तब से हटा दिया गया है, इसलिए मैं भूल गया कि यह कौन था।

+4

'toArray' का एक अधिभारित संस्करण है जो जेनेरिक –

+0

थोड़ा और नीचे स्क्रॉल करें। – SLaks

+0

@ Dgrin91 लेकिन आपको पैरामीटर के रूप में एक सरणी उदाहरण में पास करना होगा, जो ओपी पूछ रहा था। पिछली संगतता बनाए रखने के लिए – ajb

उत्तर

0

जावा में जेनरिक की प्रकृति के कारण। मिटाने के कारण, रनटाइम के दौरान कोई प्रकार की जानकारी उपलब्ध नहीं है, इसलिए नो-एर्ग संस्करण केवल ऑब्जेक्ट्स की सरणी लौटा सकता है।

+0

@GriffeyDog वे रिटर्न प्रकार को तब तक नहीं बदल सके जब तक कि कयामान कह रहा है कि टी पैरामीटर भी शामिल नहीं है। आप सही हैं कि उन्होंने पिछड़े संगतता को बनाए रखने के लिए एक अधिभार बनाया है क्योंकि मूल 'toArray() '1.2 के बाद से था और जेनेरिक केवल 1.5 के बाद से था। –

4

यह विधि एक नई सरणी बनाने के लिए माना जाता है। लेकिन, अगर आपके पास ClassT की जानकारी नहीं है, तो आप ऐसा नहीं कर सकते हैं।

आप यह नहीं कह सकते T[] array = new T[list.size()];

आप एक पैरामीटर (अन्य विधि की तरह) के रूप में सरणी पार कर लेते हैं वहाँ कोई समस्या नहीं है।

1

पूरा उत्तर यह है: क्योंकि toArray() का कार्यान्वयन T[] सरणी बनाने में सक्षम नहीं है, यह "exemplar" सरणी के बिना आपको वापस लौटने वाला है। अंतर देखने के लिए AbstractCollection में toArray(T[]) के सामान्य अधिभार के स्रोत कोड को देखें।

वे इसे Class<T> तर्क के साथ भी कर सकते थे। लेकिन कम से कम एक उदाहरण के साथ यदि आप चाहते हैं तो आप स्वयं को स्थान आवंटित कर सकते हैं (और सामान्य प्रकार G<S>) के लिए Class< G<S> > का उदाहरण बनाना लगभग असंभव है।

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