2009-09-29 32 views
18

मैंने पहले आज दंग रह गया था जब कुछ कोड डिबगिंग निम्नलिखित की तरह है कि कुछ को खोजने के लिए एक संकलन समय अपवाद फेंक नहीं है:यह संकलन क्यों करता है?

public Test() { 
    HashMap map = (HashMap) getList(); 
} 

private List getList(){ 
    return new ArrayList(); 
} 

आप कल्पना कर सकते हैं, एक ClassCastException कार्यावधि में फेंक दिया जाता है, लेकिन किसी को यह कर सकते हैं एक पर List का कास्टिंग क्यों संकलित समय पर कानूनी माना जाता है?

+0

http://stackoverflow.com/questions/19895304/classcastexception-vs-cannot-cast-compilation-error/37190861#37190861 –

उत्तर

29

क्योंकि अनुमानित रूप से getList()HashMap का उप-वर्ग लौटा सकता है जो List लागू करता है। असंभव, हाँ, लेकिन संभव है, और इसलिए संकलित।

+9

+1: एक स्पष्ट कलाकार मूल रूप से ऐसी स्थिति है जहां प्रोग्रामर संकलक को बता रहा है "I पता है कि मैं क्या कर रहा हूं, इसलिए इसे अपना रास्ता करें "- अगर संकलक को यह नहीं पता कि आप वास्तव में गलत हैं, तो यह आपके रास्ते पर जायेगा। खैर, यह एक तरीका है कि यह मुझे समझाया गया था। – weiji

+3

हाँ, यदि आप 'ArrayList' के साथ 'List' को प्रतिस्थापित करते हैं तो संकलक को शिकायत करनी चाहिए। –

+0

@weiji: यह केवल कुछ हद तक सच है, और सी या सी ++ में उससे कहीं भी कम सत्य है। जावा कंपाइलर आपको केवल इतना रस्सी देगा, और यदि ए संभवतः बी का उदाहरण नहीं हो सकता है, तो यह संकलित नहीं होगा। – skaffman

17

एक बात के लिए सूची एक इंटरफ़ेस है। ऐसा कोई कारण नहीं है कि हैश मैप के उप-वर्ग में मौजूद क्यों नहीं हो सकता है जो सूची इंटरफ़ेस को भी लागू करता है। इस स्थिति में यह पूरी तरह से मान्य होगा।

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