जावा में कास्टिंग करना जादू नहीं है, यह आप कंपाइलर को बता रहे हैं कि टाइप ए का ऑब्जेक्ट वास्तव में अधिक विशिष्ट प्रकार का बी है, और इस प्रकार बी पर सभी तरीकों तक पहुंच प्राप्त करना है जो आपके पास अन्यथा नहीं होता। आप कास्टिंग करते समय किसी भी प्रकार का जादू या रूपांतरण नहीं कर रहे हैं, आप अनिवार्य रूप से संकलक को बता रहे हैं "मुझ पर विश्वास करो, मुझे पता है कि मैं क्या कर रहा हूं और मैं आपको गारंटी दे सकता हूं कि इस लाइन पर यह वस्तु वास्तव में एक <डाली डालें" यहाँ टाइप करें> उदाहरण के लिए:
Object o = "str";
String str = (String)o;
ऊपर ठीक है, जादू नहीं और सभी अच्छी तरह से। ओ में संग्रहित वस्तु वास्तव में एक स्ट्रिंग है, और इसलिए हम बिना किसी समस्या के एक स्ट्रिंग में डाल सकते हैं।
यह गलत हो सकता है दो तरीके हैं। सबसे पहले, यदि आप दो प्रकारों के बीच पूरी तरह से अलग-अलग वंशानुगत पदानुक्रम में कास्टिंग कर रहे हैं, तो संकलक को पता चल जाएगा कि आप मूर्खतापूर्ण हैं और इसे रोकें:
String o = "str";
Integer str = (Integer)o;
दूसरे, यदि वे एक ही पदानुक्रम में हैं, लेकिन फिर भी एक अमान्य कलाकार है तो ClassCastException
रनटाइम पर फेंक दिया जाएगा:
Number o = new Integer(5);
Double n = (Double)o;
यह अनिवार्य रूप से इसका मतलब है कि आपने संकलक के विश्वास का उल्लंघन किया है। आपने बताया है कि आप गारंटी दे सकते हैं कि वस्तु एक विशेष प्रकार की है, और यह नहीं है।
आपको कास्टिंग की आवश्यकता क्यों है? ठीक है, आपके साथ शुरू करने के लिए केवल इसकी आवश्यकता होती है जब अधिक सामान्य प्रकार से अधिक विशिष्ट प्रकार तक जा रहा हो। उदाहरण के लिए, Integer
इनहेरिट करता है Number
, इसलिए यदि आप एक के Integer
रूप में स्टोर करना चाहते हैं Number
तो यह ठीक है (चूंकि सभी इंटेगर नंबर हैं।) हालांकि, यदि आप दूसरे रास्ते पर जाना चाहते हैं तो आपको एक कास्ट की जरूरत है - सभी नंबर इंटीजर नहीं हैं (साथ ही पूर्णांक के रूप में हमारे पास Double
, Float
, Byte
, Long
, आदि) वहाँ और अगर अपनी परियोजना या JDK में सिर्फ एक उपवर्ग, किसी को आसानी से एक बना सकते हैं और है कि वितरित कर सकता है, तो आप कोई गारंटी नहीं है यहां तक कि अगर आपको लगता है यह एक एकल, स्वाभाविक पसंद है !
कास्टिंग के लिए उपयोग के बारे में, आप अभी भी कुछ पुस्तकालयों में इसकी आवश्यकता देखते हैं। जावा -5 से पहले इसका उपयोग संग्रह और विभिन्न अन्य वर्गों में भारी रूप से किया जाता था, क्योंकि सभी संग्रह वस्तुओं को जोड़ने और फिर परिणाम को कास्टिंग करने के लिए काम करते थे। हालांकि, जेनेरिक के आगमन के साथ कास्टिंग के लिए बहुत अधिक उपयोग दूर हो गया है - इसे जेनेरिक द्वारा प्रतिस्थापित किया गया है जो कि क्लासकैस्टीसेप्शन की क्षमता के बिना एक बहुत अधिक सुरक्षित विकल्प प्रदान करता है (वास्तव में यदि आप जेनेरिक का उपयोग सफाई से करते हैं और यह बिना किसी चेतावनी के संकलित करता है, आपके पास एक गारंटी है कि आपको क्लासकैस्ट अपवाद कभी नहीं मिलेगा।)