2011-04-16 17 views
70

निम्नलिखित कोड (एंड्रॉयड में चलाने) मुझे हमेशा 3 पंक्ति में एक ClassCastException देता है देता है:जावा: (String []) List.toArray() ClassCastException

final String[] v1 = i18nCategory.translation.get(id); 
final ArrayList<String> v2 = new ArrayList<String>(Arrays.asList(v1)); 
String[] v3 = (String[])v2.toArray(); 

यह भी होता है जब वी 2 वस्तु है [ 0] और जब इसमें स्ट्रिंग्स भी होते हैं। कोई विचार क्यों?

+0

आप सहप्रसरण और contravariance के बारे में पढ़ सकते हैं - http://en.wikipedia.org/wiki/Covariance_and_contravariance_%28computer_science%29#Java – Hut8

+0

मामले के बारे में क्या जहां टी एक है तत्काल के लिए एक कारखाने विधि के साथ इंटरफ़ेस। – sebaj

+2

@ लेसकार्ड - यह केवल अप्रत्यक्ष रूप से कॉन्वर्सिस/contravariance से संबंधित है। असली मुद्दा यह है कि यह 'toArray()' विधि के निर्दिष्ट व्यवहार का प्रत्यक्ष परिणाम है। –

उत्तर

188

इसका कारण यह है कि जब आप

toArray() 

का उपयोग यह एक वस्तु [] है, जो एक String [] (स्ट्रिंग्स भी यद्यपि सामग्री रहे हैं) में ढाला नहीं जा सकता है यह वह जगह है देता है, क्योंकि toArray विधि केवल हो जाता है एक

List 

और नहीं

List<String> 

के रूप में जेनरिक एक स्रोत कोड केवल एक चीज है, और क्रम एक पर उपलब्ध नहीं हैं और इसलिए यह निर्धारित नहीं कर सकता कि किस प्रकार की सरणी बनाना है।

उपयोग

toArray(new String[v2.size()]); 

जो सरणी के सही तरह (String [] और सही आकार का)

+0

+1 हालांकि यह व्याख्या नहीं करता है क्यों। – corsiKa

+1

@glowcoder - एक स्पष्टीकरण – MeBigFatGuy

+2

cuz जेनरिक पर एक प्रयास जोड़ा, यही कारण है कि –

28

आप उपयोग कर रहे हैं गलत toArray()

याद रखें कि जावा के जेनरिक ज्यादातर वाक्यात्मक हैं आवंटित चीनी। एक ArrayList वास्तव में नहीं जानता है कि इसके सभी तत्व स्ट्रिंग्स हैं।

अपनी समस्या को ठीक करने के लिए, toArray(T[]) पर कॉल करें। आपके मामले में, कि

String[] v3 = v2.toArray(new String[v2.size()]); 

नोट genericized रूप toArray(T[]) रिटर्न T[], तो परिणाम स्पष्ट रूप से डाली जा की जरूरत नहीं है।

-1

ऊपर समाधान मेरे लिए काम नहीं कर रहा है। एक बेहतर उदाहरण है:

Person[] men = people.stream() 
      .filter(p -> p.getGender() == MALE) 
    .toArray(Person[]::new); 
संबंधित मुद्दे