माइकल बेरी द्वारा दिए गए उत्तर को विस्तृत करना।
Dog d = (Dog)Animal; //Compiles but fails at runtime
यहाँ आप संकलक से कह रहे हैं "मुझ पर विश्वास करो। मुझे पता d
है कि वास्तव में एक Dog
वस्तु का जिक्र है " हालांकि यह नहीं है।
याद रखें कि कंपाइलर को हम पर भरोसा करने के लिए मजबूर किया जाता है जब हम एक डाउनकास्ट करते हैं ।
संकलक केवल घोषित संदर्भ प्रकार के बारे में जानता है। रनवे पर JVM जानता है कि वास्तव में वस्तु क्या है।
इसलिए जब रनवे पर JVM यह बताता Dog d
है कि वास्तव में यह Animal
एक Dog
वस्तु का उल्लेख कर रहा है न कि किसी वस्तु का। अरे ... आपने कंपाइलर से झूठ बोला और बड़ा मोटा फेंका ClassCastException
।
तो अगर आप डाउनकास्टिंग कर रहे हैं तो आपको instanceof
खराब होने से बचने के लिए परीक्षण का उपयोग करना चाहिए ।
if (animal instanceof Dog) {
Dog dog = (Dog) animal;
}
अब एक सवाल हमारे दिमाग में आता है। क्यों नरक संकलक डाउनकास्ट की अनुमति दे रहा है जब अंततः यह एक फेंकने जा रहा है java.lang.ClassCastException
?
उत्तर यह है कि सभी कंपाइलर यह सत्यापित कर सकते हैं कि दो प्रकार एक ही वंशानुक्रम में हैं, इसलिए डाउनकास्ट से पहले जो भी कोड आ सकता है, उसके आधार पर यह संभव है कि animal
यह प्रकार का हो dog
।
संकलक को उन चीजों की अनुमति देनी चाहिए जो रनटाइम के दौरान संभव हो सकती हैं।
निम्नलिखित कोड स्निपेट पर विचार करें:
public static void main(String[] args)
{
Dog d = getMeAnAnimal();// ERROR: Type mismatch: cannot convert Animal to Dog
Dog d = (Dog)getMeAnAnimal(); // Downcast works fine. No ClassCastException :)
d.eat();
}
private static Animal getMeAnAnimal()
{
Animal animal = new Dog();
return animal;
}
हालांकि, यदि कंपाइलर को यकीन है कि कास्ट संभव काम नहीं करेगा, तो संकलन विफल हो जाएगा। IE यदि आप विभिन्न वंशानुगत पदानुक्रमों में वस्तुओं को डालने का प्रयास करते हैं
String s = (String)d; // ERROR : cannot cast for Dog to String
डाउनकास्टिंग के विपरीत, अपकास्टिंग कार्य अंतर्निहित रूप से होता है क्योंकि जब आप upcast करते हैं तो आप अंतर्निहित विधि की संख्या को सीमित कर रहे हैं जिसे आप डाउनकास्टिंग के विपरीत कह सकते हैं, जिसका अर्थ है कि बाद में, आप एक और अधिक विशिष्ट विधि को लागू करना चाहते हैं।
Dog d = new Dog();
Animal animal1 = d; // Works fine with no explicit cast
Animal animal2 = (Animal) d; // Works fine with n explicit cast
उपरोक्त अपकास्ट दोनों बिना किसी अपवाद के ठीक काम करेंगे क्योंकि एक डॉग आईएस-ए एनिमल, एनीथिंग एनी एनिमल कर सकता है, कुत्ता कर सकता है। लेकिन यह सच नहीं है vica-versa।