2012-02-17 14 views
5

मैंने हाल ही में android.os.Bundle के साथ कुछ मुद्दों में भाग लिया है कि मुझे कक्षा को विस्तारित करके और इसे अधिक आसानी से टाइप करके ठीक करने की उम्मीद है। विशिष्ट समस्या यह है कि मैं में भाग की तरह त्रुटियों था:एंड्रॉइड.ओएस.बंडल अंतिम श्रेणी क्यों है?

W/Bundle (6782): Key access_token expected byte[] but value was a java.lang.String. The default value <null> was returned. 
W/Bundle (6782): Attempt to cast generated internal exception: 
W/Bundle (6782): java.lang.ClassCastException: java.lang.String 
W/Bundle (6782): at android.os.Bundle.getByteArray(Bundle.java:1305) 
बेशक

, String से byte[] करने के लिए रूपांतरण तुच्छ है, इसलिए मेरे विचार बस है Bundle यह एक byte[] की तलाश में है, तो स्वचालित रूप से इस रूपांतरण करने के लिए था, लेकिन पाता है इसके बजाय String। यह मूर्खतापूर्ण है कि यह पहले से ही ऐसा नहीं करता है (और यह भी कि प्रत्येक आदिम प्रकार के लिए विशिष्ट गेटर्स और सेटर्स हैं और कुछ सामान्य Object प्रकार सामान्य हैं जो केवल Object के मामले में काम करते हैं, या सबसे खराब Number पर , String, और Parcelable), मेरी राय में।

लेकिन वैसे भी, मैंने जल्दी से पता चला कि मैं Bundle को बढ़ाकर समस्या को ठीक नहीं कर सकता, क्योंकि इसे final घोषित किया गया है। क्या इसके लिए कोई ज्ञात/विशिष्ट कारण है? android.os में अन्य कक्षाएं हैं जो final नहीं हैं, इसलिए Bundle इस असाइनमेंट के योग्य क्या है?

इसके अलावा, इस पर काम करने के तरीके के बारे में कोई विचार? एक रैपर वर्ग बाहर है क्योंकि इसे लागू करने के लिए कोई सामान्य interface नहीं है (कोड जो वास्तव में समस्या का कारण बनता है, किसी तृतीय-पक्ष लाइब्रेरी का हिस्सा है, इसलिए मैं इसे सीधे रैपर वर्ग में संदर्भित करने के लिए अपडेट नहीं कर सकता)।

मुझे लगता है कि कोड में सभी जगहों को शिकार करने का एकमात्र विकल्प छोड़ देता है जो कि String मूल्यों के लिए मूल्य निर्धारित करता है जो तृतीय पक्ष कोड बाइट एरे के रूप में पारित होने की अपेक्षा करता है।

+2

शायद इसी कारण से लॉग अंतिम है: आपको पेश करने के लिए। – AedonEtLIRA

+0

स्ट्रिंग से बाइट तक सी # विश्व रूपांतरण में [] छोटा है, लेकिन स्पष्ट नहीं है (यानी कनवर्ट.फ्रॉमबेस 64String, या एन्कोडिंग.यूटीएफ 8.गेटबाइट्स, या कुछ अन्य एन्कोडिंग)। क्या जावा में आधिकारिक स्ट्रिंग-> बाइट [] रूपांतरण है? –

+0

@Alexei Levenkov - हां, जावा में [स्ट्रिंग.getबाइट्स()] है (http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#getBytes())। – aroth

उत्तर

1

असल में सभी "आदिम" प्रकार अंतिम हैं। इसके लिए कुछ कारण हैं। सबसे पहले बंडल का पता लगाने योग्य है और यदि आप ओवरराइटिंग द्वारा इसके अर्थशास्त्र को तोड़ सकते हैं तो आप कुछ तोड़ सकते हैं। इसके अलावा, बंडल हमेशा एक निश्चित तरीके से कार्य करने के लिए है। यदि आप इसे ओवरराइट करते हैं तो आप उन व्यवहारों को बदल सकते हैं जो लोग उम्मीद कर रहे हैं या यहां तक ​​कि एक अपवाद तोड़ने वाले कोड को फेंक दें जिसे पहले सुरक्षित माना गया था।यह शायद तर्क दिया जा सकता है कि यह अनुमति देने के लिए एक सुरक्षा भेद्यता होगी क्योंकि वे इसे कोड के साथ ओवरराइट कर सकते हैं जो ट्रैक कर सकता है कि इससे क्या हुआ।

0

यदि आपके पास एक स्ट्रिंग था जिसे आप बाइट सरणी के रूप में डालना चाहते थे, और आप उस क्रिया को बंडल के बाहर संभाल नहीं करना चाहते थे, तो आप इसे कैसे करेंगे?

Bundle.putByteArray(String string) <<== ?? 

आप पहले से ही putByteArray() कि एक bytearray संग्रहीत करता है, और putString() कि एक स्ट्रिंग ... जैसा कि आप ने कहा कि संग्रहीत करता है, रूपांतरण तुच्छ है, इसलिए यदि आप एक स्ट्रिंग एक bytearray के रूप में, क्यों नहीं होनी चाहिए बस इसे बंडल में रखने से पहले रूपांतरण करें और जब आप इसे खींच लें तो वापस कनवर्ट करें?

जहां तक ​​क्यों वर्ग अंतिम है, आप पहले से ही पता चला है कि यह संभालती है "काफी हर आदिम प्रकार और कुछ अलग Object प्रकार", तो क्यों थोक अनावश्यक cruft साथ वर्ग? सुविधा है और फिर अनावश्यकता है ...

+1

हू? कक्षा 'अंतिम' की घोषणा कैसे क्रूर को कम करती है? एक ऐसी कक्षा के लिए जो एक एसडीके का हिस्सा है जिसका उपयोग सैकड़ों हजारों द्वारा किया जाने की उम्मीद है, यह लाखों डेवलपर्स नहीं है, मैं उम्मीद करता हूं कि एसडीके आर्किटेक्ट्स * किसी भी * क्लास फाइनल बनाने में बहुत अनिच्छुक हों, क्योंकि सब कुछ अनुमान लगाना मुश्किल है कि वे सभी डेवलपर्स करना चाहते हैं। – aroth

+0

चलो याद रखें ... हम बंडल, एक डिक्शनरी-टाइप क्लास के बारे में बात कर रहे हैं जिसका उद्देश्य परिवहन के लिए डेटा पैकेज करना है। यह सच है कि उन लाखों डेवलपर्स जो कुछ भी करना चाहते हैं, उन्हें अनुमान लगाना मुश्किल है, लेकिन मैं कल्पना कर सकता हूं कि वे अपनी अधिकांश ऊर्जा खर्च कर रहे हैं, उन सभी लाखों डेवलपर्स को करने की आवश्यकता हो सकती है। यदि वास्तव में आपके लिए यह महत्वपूर्ण है, तो मेरा सुझाव है कि आप एक एसडीके परिवर्तन अनुरोध जमा करें। –

0

कक्षा अंतिम है क्योंकि आपको की आवश्यकता नहीं है। The documentation दिखाता है कि get आईएनजी और put सभी प्रकार के प्रकारों के लिए विधियों का एक टन है। यदि आप वास्तव में String को byte[] में परिवर्तित करने के बारे में चिंतित हैं, तो आप जो जावा खोज रहे हैं वह जावा विधि (click me) है, और एंड्रॉइड के लिए कुछ अद्वितीय नहीं है।

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