java - मुझे नहीं लगता कि यह क्लासकास्ट अपवाद क्यों होता है




android serialization (3)

// Application ...
Intent i = new Intent();
i.putExtra(EXTRA_FILE_UPLOAD_URIS, mGalleryAdapter.getItems()); 

Uri[] getItems() { return mItems; }

// Service ...
intent.getParcelableArrayExtra(EXTRA_FILE_UPLOAD_URIS); //works, returns Parcelable[]
Uri[] uris = (Uri[])intent.getParcelableArrayExtra(EXTRA_FILE_UPLOAD_URIS);
// ... Breaks with ClassCastException

Uri[] को कास्ट क्यों करता है Uri[] तोड़ता है, जब Uri Parcelable ?


Arrays में polymorphic व्यवहार है - केवल सामान्य प्रकार नहीं है।

यही है, अगर Uri Parcelable लागू Parcelable

तुम कह सकते हो:

Parcelable[] pa = new Uri[size];
Uri[] ua = (Uri[]) pa;

आप नहीं कह सकते हैं:

List<Parcelable> pl = new ArrayList<Uri>();

जैसा कि आप देखते हैं कि हम वापस Uri[] डाल सकते हैं। तो समस्या क्या है? यह ClassCastException तब होता है जब आपका ऐप मारे जाते हैं और बाद में सहेजे गए सरणी को फिर से बनाया जाता है। जब इसे रनटाइम बनाया जाता है तो यह नहीं पता कि किस प्रकार की सरणी ( Uri[] ) थी, इसलिए यह सिर्फ एक Parcelable[] बनाता है और इसमें तत्व डालता है। इसलिए ClassCastException जब आप इसे Uri[] पर डालने का प्रयास करते हैं।

ध्यान दें कि अपवाद नहीं होता है (सैद्धांतिक रूप से) जब प्रक्रिया मारे नहीं जाती है और मूल रूप से बनाए गए सरणी ( Uri[] ) को राज्य को बचाने / पुन: बहाल करने के बीच पुन: उपयोग किया जाता है। जब आप अभिविन्यास बदलते हैं।

मैं सिर्फ यह स्पष्ट करना चाहता था कि ऐसा क्यों हुआ। यदि आप समाधान चाहते हैं तो @ सोलो एक सभ्य प्रदान करता है।

चियर्स


इस विधि का प्रयोग करें, यह मेरे लिए काम करता है।

Parcelable[] ps = getIntent().getParcelableArrayExtra();
Uri[] uri = new Uri[ps.length];
System.arraycopy(ps, 0, uri, 0, ps.length);

मुझे लगता है कि क्या हो रहा है निम्नानुसार है:

class Parent { }

class MaleParent extends Parent { }

class FemaleParent extends Parent { }

यदि परिदृश्य ऊपर जैसा कुछ है तो निम्नलिखित रनटाइम पर विफल हो जाएगा:

Parent[] parents = new FemaleParent[]{};
MaleParent[] maleParents = (MaleParent[]) parents;

निम्नानुसार कुछ अपवाद नहीं बढ़ाता है:

Parent[] parents = new MaleParent[]{};
MaleParent[] maleParents = (MaleParent[]) parents;





parcelable