2010-11-12 15 views
16

ऑब्जेक्ट कास्टिंग ऑब्जेक्ट से अन्य प्रकारों में कास्टिंग करते समय, दूसरी पंक्ति कास्ट से संबंधित चेतावनी क्यों उत्पन्न करती है, लेकिन पहला नहीं है?जावा: ऑब्जेक्ट को किसी सामान्य प्रकार

void a(Object o) { 
    Integer i = (Integer) o; 
    List<Integer> list = (List<Integer>) o; 
} 

/*Type safety: Unchecked cast from Object to List<Integer>*/ 
+0

दूसरी पंक्ति चेतावनी उत्पन्न करती है क्योंकि केवल जेनेरिक ऐसी चेतावनी उत्पन्न करते हैं। पहले में कोई सामान्य नहीं है, इसलिए कोई चेतावनी नहीं है। –

उत्तर

24

यह क्योंकि वस्तु वास्तव में एक List<Integer> निष्पादन में समय की वजह से प्रकार विलोपन होने के लिए जाँच की जानी नहीं होगा। यह वास्तव में इसे List पर कास्ट करेगा। उदाहरण के लिए:

List<String> strings = new ArrayList<String>(); 
strings.add("x"); 
Object o = strings; 

// Warning, but will succeeed at execution time 
List<Integer> integers = (List<Integer>) o; 
Integer i = integers.get(0); // Bang! 

विशेष रूप से type erasure section, अधिक जानकारी के लिए Angelika Langer's Java Generics FAQ देखें।

5

जॉन का जवाब सही है, लेकिन कभी-कभी आप उस चेतावनी के आसपास नहीं जा सकते (जैसे कि जब आप विरासत एपीआई के साथ काम कर रहे हों)। उन मामलों में आप तो जैसे चेतावनी को दबाने कर सकते हैं:

@SuppressWarnings("unchecked") 
List<Integer> list = (List<Integer>) someApiThatReturnsNonGenericList(); 
6

स्पष्टता के लिए, मुझे थोड़ा उदाहरण पुनर्लेखन हैं ...

मैं कहूंगा, cruxial अंतर के बीच:

void a(Object o) { 
    Integer i = (Integer) o; 
    ... 
} 

और

void a(Object o) { 
    List<Integer> list = (List<Integer>) o; 
    ... 
} 

है कि उसी दिया एक प्रकार-त्रुटि है, पहली कास्ट हमेशा निष्पादित होने पर तुरंत एक रनटाइम अपवाद (विशेष रूप से, क्लासकास्ट अपवाद) फेंक देती है।

जबकि दूसरा एक हो सकता है नहीं - जब तक इनपुट पैरामीटर ओ List<?> के किसी भी प्रकार के रूप में, निष्पादन सिर्फ आगे बढ़ना होगा, एक गलत डाली के बावजूद में।

चाहे कोड बाद में अपवाद फेंक देगा या नहीं, इस सूची के साथ आप क्या करते हैं इस पर निर्भर करता है।

परवाह किए बिना, एक अपवाद को उस रेखा पर नहीं फेंक दिया जा सकता है जहां कास्ट बनाया गया था, लेकिन कहीं और (जो पता लगाने में मुश्किल हो सकती है) या बिल्कुल नहीं।

यही मैं समझता हूं, यही कारण है कि संकलक-डिजाइनरों ने केवल दूसरे मामले में एक चेतावनी उचित मानी है।

+1

उत्कृष्ट स्पष्टीकरण। – Trilarion

+0

पहला * हमेशा एक CastClassException फेंक नहीं देगा। आने वाली वस्तु बहुत अच्छी तरह से 'इंटीजर' हो सकती है। पहली पंक्ति MIGHT एक अपवाद फेंक सकती है, जैसे कि दूसरी स्थिति 'ओ'' सूची 'नहीं है। –

+0

@ हॉट लिक्स: हाँ, यही कारण है कि मैंने लिखा है "ऊपर दिया गया है कि एक प्रकार की त्रुटि है" - मैंने बोल्ड भी रखा है;) – Rop

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