Dog d = (Dog)Animal; //Compiles but fails at runtime
यहां आप संकलक से कह रहे हैं "मेरा विश्वास करो। मैं जानता हूँ कि d
वास्तव में एक Dog
वस्तु के लिए बात कर रहा है "हालांकि यह नहीं है। संकलक याद रखें हम पर विश्वास करने के लिए जब हम एक खिन्न करना पड़ता है।
संकलक केवल घोषित संदर्भ प्रकार के बारे में जानता है। JVM पर रनटाइम जानता है कि ऑब्जेक्ट वास्तव में क्या है।
तो जब रनटाइम पर JVM का पता लगा लेता है कि Dog d
वास्तव में एक Animal
और नहीं एक Dog
वस्तु यह कहता है कि करने के लिए बात कर रहा है। हे ... आप कंपाइलर से झूठ बोला और एक बड़ी वसा ClassCastException
फेंकता है।
तो यदि आप डाउनकास्टिंग कर रहे हैं तो आपको खराब होने से बचने के लिए instanceof
परीक्षण का उपयोग करना चाहिए।
अब एक सवाल हमारे मन में आता। क्यों नरक कंपाइलर डाउनकास्ट की अनुमति दे रहा है जब अंत में यह java.lang.ClassCastException
फेंकने जा रहा है?
जवाब यह है कि सभी संकलक, सत्यापित है कि दो प्रकार के एक ही विरासत पेड़ में हैं ऐसा कर सकते हैं पर जो कुछ कोड है खिन्न से पहले आ सकता है, तो संभव है कि animal
प्रकार dog
की है निर्भर करता है।
कंपाइलर को उन चीज़ों की अनुमति देनी चाहिए जो रनटाइम पर संभव हो सके।
निम्नलिखित कोड snipet पर विचार करें:
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;
}
हालांकि, अगर संकलक लगता है कि कलाकारों होगा संभव नहीं काम, संकलन विफल हो जाएगा है। अर्थात। आप अलग अलग विरासत में वस्तुओं कास्ट करने के लिए प्रयास करते हैं तो पदानुक्रम
String s = (String)d; // ERROR : cannot cast for Dog to String
downcasting के विपरीत, upcasting परोक्ष काम करता है, क्योंकि जब आप Upcast आप परोक्ष विधि की संख्या सीमित कर रहे हैं आप, आह्वान कर सकते हैं रूप downcasting के विपरीत है, जो इसका तात्पर्य है कि बाद में, आप एक और विशिष्ट विधि का आह्वान करना चाहेंगे।
Dog d = new Dog(); Animal animal1 = d; // Works fine with no explicit cast Animal animal2 = (Animal) d; // Works fine with n explicit cast
ऊपर Upcast के दोनों किसी भी बिना किसी अपवाद के ठीक से काम करेंगे क्योंकि एक कुत्ता है-ए पशु, एक पशु क्या कर सकते हैं anithing, एक कुत्ता कर सकते हैं। लेकिन यह सच वीका-विपरीत नहीं है।
आप संकलक को त्रुटि का पता लगाने के लिए कह रहे हैं। – Mauricio