2008-12-27 17 views
28

बस समीक्षा के लिए, क्या कोई जल्दी से यह समझ सकता है कि इसे काम करने से (इसे संकलित करने पर) क्या रोकता है:त्वरित जावा प्रश्न: ऑब्जेक्ट्स की सरणी को मेरी इच्छित कक्षा की सरणी में कास्ट करना

private HashSet Data; 

... 

public DataObject[] getDataObjects() 
{ 
    return (DataObject[]) Data.toArray(); 
} 

... और यह जिस तरह से काम करता है:

public DataObject[] getDataObjects() 
{ 
    return (DataObject[]) Data.toArray(new DataObject[ Data.size() ]); 
} 

मैं नहीं हूं कास्टिंग (या जो भी हो) के साथ काम पर तंत्र पर स्पष्ट करें जो ऐसा करता है।

उत्तर

37

क्योंकि toArray() ऑब्जेक्ट की एक सरणी बनाता है, और आप Object[] को DataObject[] में इसे कास्ट करके नहीं बना सकते हैं। toArray(DataObject[])DataObject की एक सरणी बनाता है।

और हां, यह कलेक्शन क्लास की कमी है और जिस तरह जेनरिक जावा में shoehorned थे। आप उम्मीद करेंगे कि Collection<E>.toArray() ई की एक सरणी वापस कर सकता है, लेकिन ऐसा नहीं है।

toArray(DataObject[]) कॉल के बारे में दिलचस्प बात: आपको "ए" सरणी काफी बड़ी बनाने की ज़रूरत नहीं है, इसलिए आप इसे toArray(new DataObject[0]) के साथ कॉल कर सकते हैं।

जैसे इसे कॉल करना वास्तव में बेहतर है यदि आप सरणी लंबाई प्राप्त करने के लिए .length का उपयोग करते हैं। यदि प्रारंभिक लंबाई बड़ी थी और एक ही सरणी वस्तु आप पारित कर वापस आ गया था तो आप का सामना कर सकते NullPointerException रों बाद में

मैं जावा जेनरिक के बारे में पहले एक प्रश्न पूछा, और यह पूछे जाने वाले प्रश्न है कि काफी मददगार था की ओर इशारा किया गया था: http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html

+0

ठीक है। ऑब्जेक्ट [] को डेटाऑब्जेक्ट [] पर डालने का कोई तरीका है? मुझे समझ में नहीं आता कि यह फ़ंक्शन किस प्रकार मौजूद है, अन्यथा। क्षमा करें मैं इन बेवकूफ सवालों को अब रास्ते से बाहर करने की कोशिश कर रहा हूं ताकि वे मुझे बाद में परेशान न करें। –

+0

मुझे डर है कि वहां नहीं है। आपको बस दूसरे को ऑर्रे कॉल का उपयोग करना होगा। –

+0

नहीं, आप केवल एक नई सरणी बना सकते हैं और अपनी वस्तुओं को एक-एक करके कास्ट कर सकते हैं। जावा में, सरणी शायद ही कभी जाने का रास्ता है, हालांकि। – Henning

3

आपके द्वारा इच्छित सरणी (DataObject[] dataArray = (DataObject[]) objectArray;) कास्टिंग करते समय टाइप सुरक्षा सुनिश्चित करने के लिए, JVM को सरणी में प्रत्येक ऑब्जेक्ट का निरीक्षण करना होगा, इसलिए यह वास्तव में एक प्रकार का कास्ट जैसी सरल ऑपरेशन नहीं है। मुझे लगता है कि यही कारण है कि आपको सरणी उदाहरण पास करना होगा, जो toArray() ऑपरेशन तब भरता है।

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