डाउनकास्टिंग कभी-कभी आवश्यक और उचित होती है। विशेष रूप से, यह अक्सर उन मामलों में उपयुक्त होता है जहां किसी के पास ऐसी वस्तुएं होती हैं, जिनमें कुछ क्षमता नहीं हो सकती है, और कोई उस क्षमता का उपयोग करना चाहता है जब वह उस वस्तु के बिना किसी डिफ़ॉल्ट फैशन में वस्तुओं को संभालने के दौरान मौजूद हो। एक साधारण उदाहरण के रूप में, मान लीजिए String
कि यह किसी अन्य मनमानी वस्तु के बराबर है। एक String
से दूसरे के बराबर होने के लिए String
, उसे दूसरे स्ट्रिंग की लंबाई और बैकिंग कैरेक्टर ऐरे की जांच करनी चाहिए। अगर एक String
से पूछा जाए कि क्या यह बराबर है Dog
, हालांकि, यह लंबाई तक नहीं पहुंच सकता है Dog
, लेकिन यह नहीं होना चाहिए; इसके बजाय, अगर वह वस्तु जिसकी String
तुलना करने वाली है, वह नहीं हैString
तुलना में एक डिफ़ॉल्ट व्यवहार का उपयोग करना चाहिए (यह रिपोर्ट करना कि दूसरी वस्तु बराबर नहीं है)।
जिस समय डाउनकास्टिंग को सबसे संदिग्ध माना जाना चाहिए, जब डाली जा रही वस्तु को उचित प्रकार का "ज्ञात" किया जाता है। सामान्य तौर पर, यदि किसी वस्तु को एक के रूप में जाना जाता है , तो उसे संदर्भित करने के लिए, किसी प्रकार के चर के बजाय, एक Cat
प्रकार के चर का उपयोग करना चाहिए । ऐसे समय होते हैं जब यह हमेशा काम नहीं करता है। उदाहरण के लिए, एक संग्रह वस्तुओं के जोड़े को सम / विषम सरणी स्लॉट में पकड़ सकता है, इस अपेक्षा के साथ कि प्रत्येक जोड़ी में ऑब्जेक्ट एक दूसरे पर कार्य करने में सक्षम होंगे, भले ही वे अन्य जोड़े में वस्तुओं पर कार्य न कर सकें। ऐसे मामले में, प्रत्येक जोड़ी में वस्तुओं को अभी भी एक गैर-विशिष्ट पैरामीटर प्रकार को स्वीकार करना होगा, जैसे कि वे, वाक्यात्मक रूप से , किसी अन्य जोड़ी से वस्तुओं को पारित कर सकते हैं। इस प्रकार, भले ही केCat
Animal
Zoo
Cat
playWith(Animal other)
विधि केवल तब काम करेगी जब other
एक था Cat
, Zoo
उसे एक तत्व को पारित करने में सक्षम होने की आवश्यकता होगी Animal[]
, इसलिए इसके पैरामीटर प्रकार के Animal
बजाय होना चाहिए Cat
।
ऐसे मामलों में जहां डाउनकास्टिंग वैध रूप से अपरिहार्य है, व्यक्ति को बिना किसी योग्यता के इसका उपयोग करना चाहिए। मुख्य प्रश्न यह निर्धारित कर रहा है कि जब कोई समझदारी से डाउनकास्टिंग से बच सकता है, और जब संभव हो तो इसे टाल सकता है।