आमतौर पर डाउनकास्टिंग आप ऐसा करते हैं जब संकलित ज्ञान संकलक के बारे में कुछ ऐसा होता है जो आप जानते हैं (या कम से कम उम्मीद) की तुलना में कम विशिष्ट है।
आपके उदाहरण जैसी स्थितियों में, ऑब्जेक्ट को एक के रूप में बनाया गया था Apple
और फिर उस ज्ञान को रेफरेंस को प्रकार के एक चर में संग्रहीत करके फेंक दिया गया था Fruit
। फिर आप फिर से उसी रेफ़रेंस का उपयोग करना चाहते हैं Apple
।
चूंकि जानकारी केवल "स्थानीय रूप से" फेंक दी गई थी, यकीन है, संकलक उस ज्ञान को बनाए रख सकता है parent
जो वास्तव में एक है Apple
, भले ही इसका घोषित प्रकार है Fruit
।
लेकिन आमतौर पर ऐसा कोई नहीं करता। यदि आप एक बनाना चाहते हैं Apple
और इसे एक के रूप में उपयोग करना चाहते हैं Apple
, तो आप इसे एक Apple
नहीं बल्कि एक चर में संग्रहित करते हैं Fruit
।
जब आपके पास है Fruit
और इसका उपयोग करना चाहते हैं, तो Apple
इसका मतलब यह है कि आमतौर पर आपको Fruit
कुछ साधनों के माध्यम से प्राप्त होता है जो आम तौर पर किसी भी प्रकार की वापसी कर सकता है Fruit
, लेकिन इस मामले में आप जानते हैं कि यह एक था Apple
। लगभग हमेशा आपने इसका निर्माण नहीं किया है, आपको इसे किसी अन्य कोड से पारित कर दिया गया है।
एक स्पष्ट उदाहरण है अगर मेरे पास एक parseFruit
फ़ंक्शन है जो "सेब", "नारंगी", "नींबू", आदि जैसे तारों को उपयुक्त उपवर्ग में बदल सकता है; आम तौर पर हम सभी (और संकलक) इस फ़ंक्शन के बारे में जान सकते हैं कि यह किसी प्रकार का रिटर्न देता है Fruit
, लेकिन अगर मैं फोन करता हूं, parseFruit("apple")
तो मुझे पता है कि कॉल करने जा रहा है Apple
और Apple
विधियों का उपयोग करना चाह सकता है , इसलिए मैं डाउनकास्ट कर सकता हूं।
फिर से एक पर्याप्त स्मार्ट कंपाइलर यह पता लगा सकता है कि स्रोत कोड को इनलाइन करके parseFruit
मैं यहां आ रहा हूं, क्योंकि मैं इसे कंटीन्यूअस कह रहा हूं (जब तक कि यह किसी अन्य मॉड्यूल में न हो और हमारे पास अलग संकलन हो, जैसे जावा में)। लेकिन आपको आसानी से यह देखने में सक्षम होना चाहिए कि संकलक सत्यापित करने के लिए गतिशील जानकारी से जुड़े अधिक जटिल उदाहरण अधिक कठिन (या असंभव भी हो सकते हैं!)।
यथार्थवादी कोड डाउनकास्ट में आमतौर पर जहां कंपाइलर सत्यापित नहीं कर सकता है कि डाउनकास्ट जेनेरिक विधियों का उपयोग करके सुरक्षित है, और इस तरह के सरल मामलों में नहीं है क्योंकि तुरंत एक ही प्रकार की सूचना को फेंकने के बाद उसी प्रकार की जानकारी जिसे हम डाउनकास्टिंग द्वारा वापस पाने की कोशिश कर रहे हैं।