स्पष्टता के लिए, मुझे थोड़ा उदाहरण पुनर्लेखन हैं ...
मैं कहूंगा, cruxial अंतर के बीच:
void a(Object o) {
Integer i = (Integer) o;
...
}
और
void a(Object o) {
List<Integer> list = (List<Integer>) o;
...
}
है कि उसी दिया एक प्रकार-त्रुटि है, पहली कास्ट हमेशा निष्पादित होने पर तुरंत एक रनटाइम अपवाद (विशेष रूप से, क्लासकास्ट अपवाद) फेंक देती है।
जबकि दूसरा एक हो सकता है नहीं - जब तक इनपुट पैरामीटर ओ List<?>
के किसी भी प्रकार के रूप में, निष्पादन सिर्फ आगे बढ़ना होगा, एक गलत डाली के बावजूद में।
चाहे कोड बाद में अपवाद फेंक देगा या नहीं, इस सूची के साथ आप क्या करते हैं इस पर निर्भर करता है।
परवाह किए बिना, एक अपवाद को उस रेखा पर नहीं फेंक दिया जा सकता है जहां कास्ट बनाया गया था, लेकिन कहीं और (जो पता लगाने में मुश्किल हो सकती है) या बिल्कुल नहीं।
यही मैं समझता हूं, यही कारण है कि संकलक-डिजाइनरों ने केवल दूसरे मामले में एक चेतावनी उचित मानी है।
दूसरी पंक्ति चेतावनी उत्पन्न करती है क्योंकि केवल जेनेरिक ऐसी चेतावनी उत्पन्न करते हैं। पहले में कोई सामान्य नहीं है, इसलिए कोई चेतावनी नहीं है। –