2011-12-15 15 views
5

जब मुझे इसका सामना करना पड़ा तो मैं किसी समस्या पर काम कर रहा था।char से int कास्टिंग क्यों काम करता है और जावा में इंटीजर को char नहीं

(int)input.charAt(i) //works 
(Integer)input.charAt(i) // Does not work 
// input being a string 

पहला विचार है कि मेरे पास प्राथमिकताएं अलग-अलग हैं और यही कारण है कि यह काम नहीं कर रहा है। लेकिन फिर मुझे यह समझना मुश्किल लगता है कि उनके पास पहले स्थान पर इंटीजर रैपर वर्ग क्यों होगा।

संपादित करें: तब रैपर कक्षाएं होने के क्या फायदे हैं? क्या यह केवल प्राइमेटिव उपस्थिति नहीं है और डिजाइन में अधिक ओओ होने के लिए है? मुझे यह समझना मुश्किल लगता है कि tehy सहायक कैसे हैं। नया संदेह altogetehr।

+2

दिलचस्प।मैंने सोचा होगा कि यह ऑटो बॉक्स किया जा सकता है। – DerMike

उत्तर

7

आप सही हैं कि primitives अलग-अलग व्यवहार किए गए हैं। निम्नलिखित काम करेगा:

(Integer)(int)input.charAt(i); 

अंतर यह है कि तर्क एक int, (Integer)बक्से पूर्णांक है जब। यह वास्तव में एक कलाकार नहीं है, भले ही ऐसा लगता है। लेकिन अगर तर्क char है, तो यह एक कास्ट प्रयास होगा; लेकिन primitives वस्तुओं को नहीं डाला जा सकता है और इसलिए यह काम नहीं करता है। आप कर सकते हैं सबसे पहले char से int पर डालना है - यह कास्ट ठीक है क्योंकि दोनों प्राचीन प्रकार हैं - और फिर int बॉक्स किया जा सकता है।

बेशक, char ->Integer मुक्केबाजी काम कर रहा है। "क्यों नहीं?" एक अच्छा सवाल है। शायद इस तरह की सुविधा के लिए बहुत कम उपयोग किया गया होगा, खासकर जब एक ही समारोह थोड़ा और स्पष्ट होकर हासिल किया जा सकता है। (चाहिए char ->Long काम भी है, तो और char ->Short वर्ण 16 बिट कर रहे हैं, तो यह सबसे सरल हो सकता है??।)

उत्तर संपादित करने के लिए: आवरण वर्गों के लाभ यह है कि लिपटे पुरातन वस्तुओं की तरह व्यवहार किया जा सकता है: उदाहरण के लिए List<Integer> में संग्रहीत। List<int> काम नहीं करेगा, क्योंकि int कोई ऑब्जेक्ट नहीं है। तो शायद और भी प्रासंगिक सवाल होगा, ओओ भाषा में आदिम गैर-वस्तुएं क्या कर रही हैं? जवाब प्रदर्शन में है: प्राइमेटिव तेज़ हैं और कम मेमोरी लेते हैं। उपयोग केस निर्धारित करता है कि वस्तुओं की सुविधा या प्राइमेटिव के प्रदर्शन अधिक महत्वपूर्ण है या नहीं।

+0

तो संग्रह में प्राइमेटिव का उपयोग तेजी से प्रदर्शन नहीं करेगा? – gizgok

+0

@gizgok: संग्रह में प्राइमेटिव का उपयोग करने का कोई तरीका नहीं है क्योंकि primitives ऑब्जेक्ट्स नहीं हैं। यही है, आप 'सूची ' का निर्माण नहीं कर सकते, यह संकलित नहीं होता है। आदिम * सरणी * वस्तुएं हैं, इसलिए 'सूची ' काम करेगी, और हां, आप इसके साथ क्या करते हैं और कैसे, यह कम से कम या अधिक प्रदर्शन करने वाला 'सूची ' के रूप में होगा। –

2

क्योंकि इंटीजर Object है। और चार नहीं है। आप कुछ ऑब्जेक्ट में एक ऑब्जेक्ट चीज़ नहीं डाल सकते हैं।

वास्तव में आप किसी ऑब्जेक्ट के पदानुक्रम में नहीं है जो किसी अन्य वर्ग ऑब्जेक्ट में कुछ ऑब्जेक्ट नहीं डाला जा सकता है।

जैसे आप इस

Integer g = (Integer) s; 

जहां sString की वस्तु है नहीं कर सकते।

अब int कार्यों से चैट क्यों करें, क्योंकि प्रत्येक चरित्र जावा में यूनिकोड के रूप में दर्शाया जाता है, इसलिए आप इसके बारे में सोच सकते हैं क्योंकि बैकएंड चार में int का एक छोटा संस्करण है। (int 32 बिट्स है और चार 16 बिट्स है)

+0

सच है लेकिन मैंने सोचा कि ऑटो मुक्केबाजी हुई होगी। – gizgok

+0

ऑटो मुक्केबाजी केवल इंक के लिए सच है। इसका मतलब यह है कि जब आप इंटी को इंटीजर में परिवर्तित कर रहे हों तो आपको स्पष्ट रूप से कास्टिंग नहीं करना पड़ेगा। @gizgok – Zohaib

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