दिलचस्प पोस्ट
सभी गैइट टैग कैसे सूचीबद्ध करें? सी में साझा वैश्विक चर विजुअल स्टूडियो बिल्ड विफल रहता है: obj \ debug से bin \ debug को exe-file कॉपी करने में असमर्थ ड्रॉप फाइल इवेंट सिमुलेट करें COUNT (*) बनाम COUNT (1) बनाम COUNT (पीके): जो बेहतर है? खोज के लिए शांत यूआरएल डिजाइन वर्चुअलहोस्ट वाइल्डकार्ड सबडोमेन और स्टेटिक सबडोमेन के लिए सरणी की सभी सामग्री को सी # में प्रिंट करना पॉलिमर क्वेरी सिलेक्टर DartVM पर काम कर रहा है, लेकिन संकलन के बाद क्रोम में नहीं स्ट्रीम क्यों करता है <टी> अस्थिर <T> लागू नहीं? दिनांक प्रारूप को "% d /% m /% Y" में परिवर्तित करना ईगिट और गीथहब के साथ "ऑथ विफल" त्रुटि टंकिनर पाठ विजेट में लाइन संख्या जोड़ने कैसे .NET TreeView के लिए विंडोज देशी देखो पाने के लिए? पायथन SQL संख्या 3 डेटाबेस में numpy array डालें

जावा में डाउनकास्टिंग

अपवाद की अनुमति जावा में है, हालांकि डाउनकास्टिंग एक संकलन त्रुटि देता है।

एक डाली जोड़कर संकलन त्रुटि को हटाया जा सकता है, लेकिन फिर भी रनटाइम पर तोड़ना होगा

इस मामले में क्यों जावा रनटाइम पर निष्पादित नहीं किया जा सकता है, अगर वे डाउनकास्टिंग की अनुमति देते हैं?
क्या इस अवधारणा के लिए कोई व्यावहारिक उपयोग है?

public class demo { public static void main(String a[]) { B b = (B) new A(); // compiles with the cast, // but runtime exception - java.lang.ClassCastException } } class A { public void draw() { System.out.println("1"); } public void draw1() { System.out.println("2"); } } class B extends A { public void draw() { System.out.println("3"); } public void draw2() { System.out.println("4"); } } 

वेब के समाधान से एकत्रित समाधान "जावा में डाउनकास्टिंग"

डाउनकास्टिंग की अनुमति दी जाती है जब यह संभावना है कि यह रन टाइम पर बढ़ जाता है:

 Object o = getSomeObject(), String s = (String) o; // this is allowed because o could reference a String 

कुछ मामलों में यह सफल नहीं होगा:

 Object o = new Object(); String s = (String) o; // this will fail at runtime, because o doesn't reference a String 

दूसरों में यह काम करेगा:

 Object o = "a String"; String s = (String) o; // this will work, since o references a String 

ध्यान दें कि कुछ डाटों को संकलन के समय अस्वीकार कर दिया जाएगा, क्योंकि वे कभी भी सफल नहीं होंगे:

 Integer i = getSomeInteger(); String s = (String) i; // the compiler will not allow this, since i can never reference a String. 

अपने उदाहरण का प्रयोग करके, आप ऐसा कर सकते हैं:

 public void doit(A a) { if(a instanceof B) { // needs to cast to B to access draw2 which isn't present in A // note that this is probably not a good OO-design, but that would // be out-of-scope for this discussion :) ((B)a).draw2(); } a.draw(); } 

मेरा मानना ​​है कि यह सभी स्थैतिक रूप से टाइप की गई भाषाओं पर लागू होता है:

 String s = "some string"; Object o = s; // ok String x = o; // gives compile-time error, o is not neccessarily a string String x = (String)o; // ok compile-time, but might give a runtime exception if o is not infact a String 

टाइपकास्ट प्रभावी रूप से कहता है: मान लें कि यह कलाकार वर्ग के लिए एक संदर्भ है और इसका इस्तेमाल इस तरह के रूप में है अब, मान लीजिए ओ वास्तव में एक पूर्णांक है, यह मानते हुए कि यह एक स्ट्रिंग है, कोई मतलब नहीं है और अप्रत्याशित परिणाम देगा, इस प्रकार एक रनटाइम चेक होना चाहिए और रनटाइम पर्यावरण को सूचित करने का अपवाद होना चाहिए कि कुछ गलत है

व्यावहारिक उपयोग में, आप अधिक सामान्य वर्ग पर काम कर रहे कोड लिख सकते हैं, लेकिन अगर आप यह जानते हैं कि यह क्या उप-वर्ग है और उसे इस तरह से व्यवहार करने की जरूरत है तो उसे उप-वर्ग में डालें एक विशिष्ट उदाहरण ऑब्जेक्ट ओअर्स () को ओवरराइड कर रहा है। मान लें कि हमारे पास कार के लिए एक क्लास है:

 @Override boolean equals(Object o) { if(!(o instanceof Car)) return false; Car other = (Car)o; // compare this to other and return } 

हम सभी को यह देख सकते हैं कि आपके द्वारा प्रदान किया गया कोड रन टाइम पर काम नहीं करेगा। ऐसा इसलिए है क्योंकि हम जानते हैं कि अभिव्यक्ति new A() कभी भी B प्रकार की वस्तु नहीं हो सकती।

लेकिन ऐसा नहीं है कि संकलक यह कैसे देखता है। जब संकलक जांच करता है कि कलाकार को अनुमति है या नहीं, यह सिर्फ यह देखता है:

 variable_of_type_B = (B)expression_of_type_A; 

और जैसा कि दूसरों ने दिखाया है, इस प्रकार का कलाकार बिल्कुल कानूनी है दाहिनी ओर अभिव्यक्ति बहुत अच्छी तरह से टाइप B ऑब्जेक्ट का मूल्यांकन कर सकती है। संकलक देखता है कि A और B में उपप्रकार संबंध है, इसलिए कोड के "अभिव्यक्ति" दृश्य के साथ, कास्ट काम कर सकता है

कंपाइलर विशेष मामले पर विचार नहीं करता है जब यह वास्तव में जानता है कि ऑब्जेक्ट प्रकार expression_of_type_A वास्तव में क्या होगा। यह सिर्फ स्थिर प्रकार को A रूप में देखता है और मानता है कि डायनेमिक प्रकार A या A कोई वंश, जिसमें B

इस मामले में क्यों जावा रनटाइम पर निष्पादित नहीं किया जा सकता है, अगर वे डाउनकास्टिंग की अनुमति देते हैं?

मेरा मानना ​​है कि इस वजह से संकलक को जानने के लिए कोई रास्ता नहीं है कि अगर कलाकार सफल होगा या नहीं। आपके उदाहरण के लिए, यह देखना आसान है कि कलाकार विफल हो जायेगा, लेकिन ऐसे कई बार भी हैं जहां यह स्पष्ट नहीं है।

उदाहरण के लिए, कल्पना कीजिए कि बी, सी, और डी सभी प्रकार टाइप ए, और फिर एक विधि public A getSomeA() एक यादृच्छिक रूप से उत्पन्न संख्या के आधार पर या तो बी, सी या डी का एक उदाहरण देता है। कंपाइलर यह नहीं जान सकता कि इस पद्धति से कौन सा सटीक रन-टाइम प्रकार वापस किया जाएगा, इसलिए यदि आपने बाद में परिणामों को B में डाल दिया, तो पता करने का कोई तरीका नहीं है कि क्या कलाकार सफल होगा (या विफल)। इसलिए कंपाइलर का मानना ​​है कि कब्ज सफल होंगे।

@ मूल पोस्टर – इनलाइन टिप्पणियां देखें

 public class demo { public static void main(String a[]) { B b = (B) new A(); // compiles with the cast, but runtime exception - java.lang.ClassCastException //- A subclass variable cannot hold a reference to a superclass variable. so, the above statement will not work. //For downcast, what you need is a superclass ref containing a subclass object. A superClassRef = new B();//just for the sake of illustration B subClassRef = (B)superClassRef; // Valid downcast. } } class A { public void draw() { System.out.println("1"); } public void draw1() { System.out.println("2"); } } class B extends A { public void draw() { System.out.println("3"); } public void draw2() { System.out.println("4"); } } 

डाउनकास्ट मामले में काम करता है जब हम एक अपसाइड ऑब्जेक्ट के साथ काम कर रहे हैं। upcasting:

 int intValue = 10; Object objValue = (Object) intvalue; 

तो अब यह objValue चर हमेशा int डाउनकास्ट किया जा सकता है क्योंकि जो ऑब्जेक्ट को डाली गई थी वह Integer ,

 int oldIntValue = (Integer) objValue; // can be done 

लेकिन क्योंकि objValue एक ऑब्जेक्ट है, इसे String डाला नहीं जा सकता क्योंकि int को String डाला नहीं जा सकता।

निम्न कोड स्निपेट में डाउनकास्टिंग बहुत उपयोगी है, मैं हर समय इसका उपयोग करता हूं। इस प्रकार यह साबित करना कि डाउनकास्टिंग उपयोगी है

 private static String printAll(LinkedList c) { Object arr[]=c.toArray(); String list_string=""; for(int i=0;i<c.size();i++) { String mn=(String)arr[i]; list_string+=(mn); } return list_string; } 

मैं स्ट्रिंग को लिंक्ड सूची में संग्रहीत करता हूं जब मैं लिंक्ड सूची के तत्वों को पुनः प्राप्त करता है, तो ऑब्जेक्ट वापस आते हैं स्ट्रिंग्स (या किसी अन्य क्लास ऑब्जेक्ट्स) के रूप में तत्वों तक पहुंचने के लिए, डाउनकास्टिंग से मुझे मदद मिलती है

जावा हमें निराश कोड को संकलित करने की अनुमति देता है, भरोसा है कि हम गलत काम कर रहे हैं फिर भी अगर मनुष्य एक गलती करते हैं, तो यह रनटाइम पर पकड़ा जाता है।

नीचे दिए गए उदाहरण पर विचार करें

 public class ClastingDemo { /** * @param args */ public static void main(String[] args) { AOne obj = new Bone(); ((Bone) obj).method2(); } } class AOne { public void method1() { System.out.println("this is superclass"); } } class Bone extends AOne { public void method2() { System.out.println("this is subclass"); } } 

यहां हम उपवर्ग बोन की वस्तु बनाते हैं और उसे सुपर क्लास के लिए एक संदर्भ में सौंप दिया है और अब सुपरक्लस संदर्भ को संकलन के दौरान subclass अर्थात् हड्डी में विधि विधि 2 के बारे में नहीं पता है.इसलिए हम उप-वर्ग संदर्भ के लिए सुपरक्लाइड के इस संदर्भ को घृणा करना चाहते हैं ताकि परिणामी संदर्भ उपवर्ग यानी हड्डी में तरीकों की उपस्थिति के बारे में पता कर सकते हैं