2011-11-22 14 views
5

के साथ जावा कास्टिंग कोई बता सकता है कि यहां क्या हो रहा है?सुपरक्लास संदर्भ

मान लें Car और BikeVehicle के उप-वर्ग हैं।

ऐसा लगता है कि Vehicle v संदर्भ Bike पर डाला जाता है। मुझे पता है कि यह अवैध है और वास्तव में संकलक ... Car cannot be cast to Bike से बाहर निकलता है।

लेकिन यह VehicleBike पर नहीं डाला जा सकता है? सब के बाद, Vehicle v एक Vehicle संदर्भ है।

public class Test { 
    public static void main(String[] args) { 
     Vehicle v = new Car(); 
     Bike b = (Bike) v; 
     // some stuff 
    } 
} 
+1

क्योंकि JVM जानता है कि यह एक कार है जब यह अपवाद फेंक रहा है। –

+0

कंपाइलर अपवाद को विभाजित नहीं करता है। कोड ** रनटाइम ** 'क्लासकास्ट अपवाद' फेंकता है। –

+0

@ प्रिग्नेंट माँ, अगर आप उनमें से किसी से खुश हैं तो कृपया एक उत्तर स्वीकार करें। – Reddy

उत्तर

3

त्रुटि संदेश Car कहता है क्योंकि यह रन टाइम अपवाद है। चूंकि इस समय तक यह वास्तविक उदाहरण (कार, बाइक, या वाहन) जानता है, वाहन संदर्भ इंगित कर रहा है, यह अधिक विशिष्ट त्रुटि संदेश देता है।

यदि यह संकलन समय पर कुछ अपवाद है, तो कंपाइलर ने Vehicle का उल्लेख किया होगा क्योंकि संकलक वास्तविक संदर्भ को नहीं जानता है कि वाहन संदर्भ इंगित कर रहा है।

+0

समझ में आता है! धन्यवाद। – m0therway

1

यह वास्तव में Car है जिसे कास्ट किया जा रहा है। vVehicle प्रकार है इसलिए Vehicle v = new Car(); का कार्य Car के बाद से काम करता है Vehicle है।

ऑब्जेक्ट v इसकी पहचान बरकरार रखता है; यह Car है। तो अवैध कास्ट Car से Bike से है।

0

लाइन

Bike b = (Bike) v; 

कानूनी हो सकता है अगर, कहते हैं, v था एक Vehicle पारित कर दिया-इन। तो मुझे लगता है कि अनुकूलन की प्रक्रिया में यह सत्यापन हो रहा है। संकलक सामान्य रूप से कास्टिंग में सामान्य कार्य को अनुकूलित करना चाहता है यदि यह कर सकता है - शायद b को पूरी तरह से अनुकूलित करें - और निश्चित रूप से vके रूप में Car की बजाय पिछली पंक्ति पर बनाया गया था।

+0

बस पैडेंटिक होने के लिए, यह लाइन वैध है अगर केवल वही है यदि v वस्तु बाइक ऑब्जेक्ट (या सबक्लास का उदाहरण है) चाहे वी ऑब्जेक्ट कहां से आता है। –

0

एक (अर्ध) सादे अंग्रेज़ी प्रतिक्रिया:

कार अचानक क्योंकि एक बाइक विभिन्न गुणों (चर) के लिए होता है न "बन" कर सकते हैं एक बाइक या एक मोटर साइकिल की तरह व्यवहार किया, का वर्णन यह, और अलग अलग के तरीकों से इसके साथ (विधियों) पर बातचीत करें।

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

ArrayList<Vehicle> vehicles = new ArrayList<Vehicle>(); 
vehicles.add(new Bike()); 
vehicles.add(new Car()); 
vehicles.add(new Bike()); 

//Some other crazy code 

for(Vehicle v : vehicles) { 
    v.applyBrakes(); 
    v.changeDownGear(); 
    v.turnRight(); 
} 

वाहन (बाइक, कार, Segway आदि) में से प्रत्येक उपवर्ग उन तरीकों के अपने स्वयं के कार्यान्वयन है और खुद को उचित रूप से निपटने

0

होगा: आप इस तरह तर्क है जब

यह सरल बना देता है स्रोत कोड के बिना निश्चित रूप से यह कहना असंभव है कि कानूनी क्या है और क्या नहीं है।हालांकि, यह मान लेना कि इन कक्षाओं के लिए विरासत वृक्ष की तरह

Vehicle 
     | 
    __________ 
    |   | 
Car  Bike 

इस तरह की है कि Car और Bike जिसका अर्थ है कि VehicleCar और Bike का सामान्यीकरण है Vehicle की उपवर्गों हैं कुछ लग रहा है सुरक्षित है। जावा में, आप इसके बेस क्लास में उप-वर्ग का उदाहरण डाल सकते हैं। तो इस मामले में आप एक वाहन में Car डाल सकते हैं और इसका इलाज कर सकते हैं जैसे कि वास्तव में Vehicle ऑब्जेक्ट का उदाहरण था। Bike के साथ भी यही सच है। हालांकि, क्योंकि CarBike का उप-वर्ग नहीं है, आप एक से दूसरे तक नहीं डाले जा सकते हैं। सभी CarsVehicles हैं लेकिन सभी VehiclesCars नहीं हैं। न ही वे Bikes हैं। और Car कभी भी Bike और इसके विपरीत नहीं है।

आप ऐसा कोड बनाने के लिए ऐसा करते हैं जो अधिक एक्स्टेंसिबल है। उदाहरण के लिए आप कोड लिख सकते हैं जो समझता है कि भविष्य में लिखे गए कोड के साथ कैसे बातचीत करें। इसका एक उदाहरण कुछ सामान्य इंटरफेस होगा, जैसे कि drive() जो अन्य डेवलपर्स को बाद में कस्टम कार्यान्वयन प्रदान करने की अनुमति देता है। हालांकि, आपका कोड हाथ से पहले लिखा गया है, फिर भी इसके साथ काम कर सकता है क्योंकि यह नए उप-वर्गों का इलाज कर सकता है जैसे कि वे बेस क्लास के उदाहरण थे।

संबंधित मुद्दे