2013-01-06 22 views
5

मेरे पास कोड स्निपेट से नीचे है और यह ठीक काम करता है। इसे संकलित समय त्रुटि को फेंकना नहीं चाहिए क्योंकि मैंने c को ArrayList के रूप में परिभाषित किया है जिसमें String ऑब्जेक्ट होगा लेकिन मैं Integer ऑब्जेक्ट जोड़ रहा हूं। तो क्यों यह संकलन समय/रन टाइम त्रुटि फेंक नहीं?इस संग्रह के साथ जेनेरिक के साथ घोषित कोई त्रुटि नहीं है?

Collection c = new ArrayList<String>(); 
c.add(123); 

मैं नीचे पता टाइम त्रुटि लेकिन ऊपर नहीं क्यों संकलन फेंक देते हैं। इन कोड स्निपेट दोनों के बीच तार्किक अंतर क्या है?

Collection<String>() c = new ArrayList(); 
c.add(123); 
+0

पहले को 'कच्ची प्रकार "चेतावनी देना चाहिए। कंपाइलर का ध्यान रखें। अपने कोड लिंट को मुक्त रखना एक अच्छा विचार है। –

उत्तर

6

पहले कोड स्निपेट क्योंकि लाइन

c.add(123) 

संकलक ग के प्रकार के निरीक्षण पर एक संकलन समय त्रुटि में परिणाम नहीं है,। चूंकि आप सी Collection के रूप में घोषित कर चुके हैं, इसलिए संकलक इसे इस तरह मानता है। चूंकि Collection एक विधि add(Object) प्रदान करता है, यह add सी के लिए किसी भी वस्तु को विशेष रूप से एक पूर्णांक के लिए बिल्कुल उचित है। ध्यान दें कि यह प्रोग्राम होगा, हालांकि परिणामस्वरूप रनटाइम-त्रुटि होती है, यदि आप स्ट्रिंग्स के रूप में संग्रह मानों को वापस पढ़ने का प्रयास करते हैं।

अपने दूसरे कोड स्निपेट में आप कंपाइलर के साथ काम करने के लिए अधिक जानकारी प्रदान करते हैं। इस स्निपेट में यह जानता है कि Collection यह Collection<String> है, जो केवल Strings स्वीकार कर सकता है। इस प्रकार, add(int) या add(Object), केवल add(String) कोई विधि नहीं है। यह एक संकलन-समय त्रुटि की ओर जाता है।

+0

ओपी का पहला स्निपेट ठीक चला जाएगा; जब तक आप 'स्ट्रिंग' के रूप में 'इंटीजर' को पढ़ने की कोशिश नहीं करते हैं तब तक कोई रनटाइम त्रुटि नहीं होगी। –

+0

@Alexander वहाँ कोई रनटाइम त्रुटि आदर्श नहीं है? – emilly

+0

मैंने सोचा होगा कि एक होगा, लेकिन @ ओली चार्ल्सवर्थ की टिप्पणी के अनुसार, अपने उत्तर में, ऐसा लगता है कि ऐसा नहीं है। मैं वहां एक होने के लिए पसंद करता हूं, लेकिन स्पष्ट रूप से जावा ऐसा नहीं सोचता :) –

3

कारण है कि यह समय त्रुटि संकलन फेंक नहीं किया?

क्योंकि यह वाक्य रचनात्मक या अर्थात् अमान्य नहीं है, यह सिर्फ मूर्ख है।

ध्यान दें कि सबसे आधुनिक IDEs (जैसे ग्रहण) विन्यस्त किया जा सकता unparameterised Collection c के बारे में चेतावनी देने के लिए, और वैकल्पिक रूप संकलित करने के लिए विफल।

+0

वैसे ओली इसे रनटाइम त्रुटि देना चाहिए क्योंकि मैंने ऐरेलिस्ट को घोषित किया है जिसमें स्ट्रिंग ऑब्जेक्ट होना चाहिए लेकिन मैं पूर्णांक वस्तु जोड़ रहा हूं। लेकिन यह किसी भी रनटाइम त्रुटि भी नहीं दिया। ऐसा क्यों? – emilly

+2

@emilly: क्योंकि जेनेरिक रनटाइम पर मौजूद नहीं है; वे * मिटाए गए * हैं। तो रनटाइम पर, सभी संग्रह इस तरह कार्य करते हैं जैसे वे कच्चे (अपरिवर्तित) हैं। –

+0

फिर नए ArrayList () सही करने का कोई फायदा नहीं है? वास्तव में तत्व प्रकार के साथ सही हैंडसाइड पर संग्रह घोषित करना बेकार अपवाद है चेतावनी दबाने – emilly

0

पहले उदाहरण में, संग्रह "कच्चा" है। यह आमतौर पर एक चेतावनी का परिणाम होगा लेकिन एक त्रुटि नहीं (आपके सटीक सेट-अप के आधार पर)। यह सभी प्री-जावा 5 विरासत कोड को संकलित करने में सक्षम होने के लिए प्राथमिक है।

दूसरा उदाहरण, आप एक पैरामीटर संस्करण पर "कच्चे" ऑब्जेक्ट असाइन करते हैं, जिसे केवल एक स्पष्ट कलाकार के साथ किया जा सकता है।

+0

आदर्श रूप से इसे रनटाइम त्रुटि का परिणाम होना चाहिए, लेकिन उसने इसे फेंक नहीं दिया :( – emilly

0

1) तार्किक अंतर क्या है?

ऊपर: एक संग्रह सामान्य प्रकार के बिना घोषित किया जा सकता है। इसे raw type कहा जाता है। संग्रह तब किसी भी प्रकार का संग्रह रख सकता है। चूंकि, एक कच्चे टाइप किए गए संग्रह के साथ, रनटाइम पर स्ट्रिंग्स का संग्रह एक रनटाइम अपवाद के कारण पूर्णांक के संग्रह के रूप में उपयोग करता है, इसलिए संकलक आमतौर पर चेतावनी फेंक देगा। चूंकि आपने उपर्युक्त उदाहरण में संग्रह टाइप नहीं किया है क्योंकि संकलक इन रनटाइम अपवादों को रोक नहीं सकता है। अगर आपको पता है कि यह क्या है और पता है कि आप क्या कर रहे हैं तो चेतावनी को अनदेखा किया जा सकता है।

नीचे: लेकिन संग्रह के रूप में घोषित एक चर < स्ट्रिंग > किसी भी प्रकार का संग्रह नहीं रख सकता है। यह को प्रकार स्ट्रिंग का संग्रह होना चाहिए।यह मजबूत टाइप है। संकलक इसे एक त्रुटि के रूप में देखने के लिए सही है।

2) उपर्युक्त स्निपेट क्यों संकलक त्रुटि का कारण नहीं बनता है?

जावा strong typed है, जो type safety सुनिश्चित करता है। उपरोक्त स्निपेट सुरक्षित प्रकार नहीं है, लेकिन फिर भी जावा द्वारा अनुमत है। यह शायद ऐतिहासिक कारणों से है: जेनरिक केवल जावा 1.5 के साथ पेश किए गए थे, इसलिए अगर उपरोक्त स्निपेट ने संकलन त्रुटि उत्पन्न की होगी तो अधिकांश जावा 1.4 कोड जावा 1.5 कंपाइलर में टूटा होगा।

प्रत्येक प्रोग्रामिंग भाषा ऐसी पिछड़े संगत तरीके से विकसित नहीं होती है (उदाहरण के लिए PHP)। जाहिर है पिछली संगतता जावा 1.5 को पेश करते समय टाइप सुरक्षा पर मूल्यवान थी।