2009-11-12 20 views
5

जावा में कास्टिंग के इन दो तरीकों के बीच क्या अंतर है?जावा में कास्टिंग के इन दो तरीकों के बीच क्या अंतर है?

  1. (CastingClass) objectToCast;

  2. CastingClass.class.cast(objectToCast);

Class#cast(Object) के स्रोत इस प्रकार है:

public T cast(Object obj) { 
if (obj != null && !isInstance(obj)) 
    throw new ClassCastException(); 
return (T) obj; 
} 

तो, cast मूल रूप से डाली आपरेशन के एक सामान्य आवरण है, लेकिन मैं अभी भी नहीं करता समझें कि आपको इसके लिए एक विधि क्यों चाहिए।

+0

ठीक है, तो मैं बस एहसास हुआ कि आप एक आदिम प्रकार के आवरण को कास्ट करने के लिए 'cast' उपयोग कर सकते हैं। जैसे 'इंटीजर i = int.class.cast ("1234"); ' –

+0

@ सिंबंबॉट: आप इसे _write_ कर सकते हैं, लेकिन यह ऐसा नहीं करेगा जो आपको लगता है कि यह संभवतः करता है। कोशिश करो। –

+0

यह क्लासकास्ट अपवाद फेंक देगा, क्योंकि स्ट्रिंग प्रकार इंटीजर नहीं है। उस मामले में आपको 'Integer.valueOf (" 1234 ") की आवश्यकता होगी। –

उत्तर

7

आप केवल सांख्यिकीय रूप से जुड़े वर्गों के लिए पहले फॉर्म का उपयोग कर सकते हैं।

कई मामलों में यह पर्याप्त नहीं है - उदाहरण के लिए, आपने प्रतिबिंब का उपयोग करके कक्षा आवृत्ति प्राप्त की हो सकती है या इसे पैरामीटर के रूप में आपकी विधि में पास कर दिया गया है; इसलिए दूसरा रूप।

+0

दाएं। पहले फॉर्म में, आप स्रोत कोड में कास्ट "बेकिंग" कर रहे हैं। आप बिना किसी संकलन के इसे बदल सकते हैं। दूसरा रूप आपको एक मनमाने ढंग से कक्षा में डालने की कोशिश करने की अनुमति देता है। –

4

क्योंकि आप (T)objectToCast लिख नहीं सकते हैं, जब T एक सामान्य प्रकार पैरामीटर (प्रकार मिटाने के कारण) है। जावा कंपाइलर आपको ऐसा करने देगा, लेकिन T को Object के रूप में माना जाएगा, इसलिए कलाकार हमेशा सफल रहेगा, भले ही आप जिस वस्तु को कास्टिंग कर रहे हैं वह वास्तव में T का उदाहरण नहीं है।

+0

हाय पावेल, क्या आप इसे थोड़ा और समझाएंगे? 'कास्ट' ऐसा ही प्रतीत होता है: 'वापसी (टी) obj;' –

+0

आप निश्चित रूप से इसे लिख सकते हैं। यह केवल एक कंपाइलर चेतावनी उत्सर्जित करता है। – meriton

+0

@meriton: अच्छा बिंदु, संपादित। मैं जो कहना चाहता था वह यह है कि कलाकार अभी भी ऐसा नहीं करेगा जो वास्तव में करना चाहिए। –

2

यह पहला साधारण कलाकार है। यह आवश्यक है कि कास्ट करने के लिए प्रकार संकलित समय पर जाना जाता है। यह संकलन समय पर सत्यापित करता है कि सही हो सकता है, और चेक (यदि कास्ट करने के लिए प्रकार सामान्य नहीं है) कि रनटाइम पर सही है।

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

टाइप पैरामीटर केवल संकलन प्रकार पर ज्ञात हैं, इसलिए आप एक प्रकार पैरामीटर के लिए दूसरे दृष्टिकोण का उपयोग नहीं कर सकते (अभिव्यक्ति T.class संकलित नहीं है)।

गतिशील रूप से लोड किए गए वर्ग (उदाहरण के लिए क्लास.forनाम (स्ट्रिंग) के साथ) केवल रनटाइम पर ज्ञात हैं, इसलिए पहला दृष्टिकोण उपयोग नहीं किया जा सकता है।

संपादित करें: हालांकि, जैसा कि पावेल बताता है, यह गतिशील रूप से लोड कक्षा में डालने का कोई मतलब नहीं है। मैं मानता हूं कि Class.cast(Object) की एकमात्र असली उपयोगिता एक प्रकार पैरामीटर को डालने के लिए है जिसके लिए आपको क्लास ऑब्जेक्ट उपलब्ध है।

यदि टाइप करने के प्रकार में टाइप पैरामीटर नहीं होता है, तो पहला दृष्टिकोण बेहतर होता है, क्योंकि अतिरिक्त संकलन समय की जांच बग को पकड़ सकती है, आप रनटाइम पर कोई प्रकार की सुरक्षा नहीं खोते हैं, और बूट करने के लिए एक छोटा वाक्यविन्यास प्राप्त करते हैं।

+2

गतिशील रूप से लोड कक्षाओं के लिए, हालांकि, आपको एक कलाकार की आवश्यकता क्यों होगी? एक कास्ट आमतौर पर अभिव्यक्ति को कुछ प्रकार के लिए मजबूर करने के लिए मजबूर करता है, लेकिन गतिशील रूप से लोड कक्षाओं के मामले में आप अग्रिम प्रकार को नहीं जानते हैं। आखिरकार, यदि आपके पास गतिशील रूप से लोड की गई कक्षा है, तो आप नहीं जानते कि 'टी 0' क्लास .cast() 'पर कॉल में क्या है, तो आप केवल कच्चे संस्करण का उपयोग करेंगे, और फिर वापसी का प्रकार होगा 'ऑब्जेक्ट' बनें - एक कास्ट नहीं। यह प्रकार की जांच करेगा, लेकिन निश्चित रूप से 'Class.isInstance()' ऐसा करने का एक बेहतर तरीका है। सब कुछ, यह वास्तव में मुझे लगता है कि यह केवल जेनेरिक के लिए है। –

+0

आप सही हैं। तदनुसार मेरा जवाब संपादित किया है। – meriton

0

Here आप एक उदाहरण उदाहरण पा सकते हैं जिसमें Class#cast() का उपयोग किया जाता है। यह नई अंतर्दृष्टि दे सकता है।

1

पहले में आप में कास्टिंग क्लास हार्डकोड करने के लिए है।

(ClassToCast) objectToCast; 

दूसरा एक कास्टिंग वर्ग शायद एक पैरामीटर में:

Class toCast = getClassToCast(); 

toCast.cast(objectToCast); 
संबंधित मुद्दे