2014-09-05 18 views
5

असंगत प्रकारों त्रुटि पर ठोकर खाई जिसके कारण मुझे समझ में नहीं आया।जेनिक्स असंगत प्रकार

कोड का यह टुकड़ा गलत क्यों है?

List<List<String>> a = new ArrayList<>(); 
List b = a; // is ok 
List<List> c = a; // incompatible types 

उत्तर

7

यह here वर्णित है। सुपरटेप संगतता केवल 'बाहरी' स्तर पर काम करती है, लेकिन टाइप पैरामीटर में 'अंदर' नहीं है। यह सहज नहीं है, लेकिन इस तरह यह काम करता है ... इसके अतिरिक्त, List एक कच्चा प्रकार है, और यह List<Object> से थोड़ा अलग व्यवहार करता है - जिसे here वर्णित किया गया है।

3
List<List> 

जो

List<List<String>> 

कारण है कि यह पहला मामला में सफल होता है प्रकार निष्कर्ष की वजह से है का जनक नहीं है परोक्ष

List<List<Object>>

है। संकलक अनिवार्य रूप से जाँच करेगा जो प्रकार अभिव्यक्ति के लिए आवश्यक है समझ बनाने के लिए और यह

List<List<String>> a = b; 

उत्पन्न होगा दूसरे मामले में यह

List<List<Object>> a = b // which does not compile 
+0

मुझे यह मिला, लेकिन दूसरी पंक्ति संकलन समय त्रुटि क्यों नहीं देती है, क्योंकि यह तीसरी पंक्ति के समान रनटाइम त्रुटियों का कारण बन सकती है? –

+0

यही कारण है कि आपको कच्चे प्रकारों पर जेनेरिक पसंद करना चाहिए। जेनेरिक कोड आपको इस मामले में टाइप-सुरक्षा की गारंटी देता है, कच्चा कोड नहीं करता है। – Seb

3

लेखन लागू हो जाएगी

List b = a; 

जेनेरिक शामिल नहीं है। यह नामित कच्चे सूची प्रकार को परिभाषित करता है जो किसी भी वस्तु को तत्व के रूप में ले सकता है।

List<List> c = a; 

से इसकी तुलना नहीं है के रूप में यह जेनरिक शामिल है और यही कारण है कि संकलक प्रकार संगतता यहाँ जाँच लागू करेंगे है।

+0

हां, लेकिन अगर कोड में आगे है तो हम b.add (नया ऑब्जेक्ट()) कॉल करेंगे; यह रनटाइम त्रुटि फेंक देगा क्योंकि हम मूल रूप से a.add (नया ऑब्जेक्ट()) करेंगे; मेरा सवाल यह है कि तीसरी पंक्ति संकलन समय में त्रुटियों को देकर आकस्मिक त्रुटियों को क्यों रोकती है, जबकि दूसरा एक –

+0

नहीं है कि रनटाइम त्रुटि प्रकार संगतता जांच के हमारे असंतोष से संबंधित नहीं है। –

+0

मुझे लगता है कि आपकी टिप्पणी पहले से ही मेरे उत्तर में दी गई है। –

2

संक्षिप्त उत्तर: क्योंकि आपकी c सूची में सभी प्रकार की वस्तुओं के साथ एक सूची है।
उदाहरण के लिए आप Integer ऑब्जेक्ट्स भी जोड़ सकते हैं।
और a सूची में केवल String ऑब्जेक्ट्स हो सकती हैं।

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