2013-03-01 8 views
8

मैं वर्तमान में जावा ओसीए परीक्षा के लिए अध्ययन कर रहा हूं और ऐरेलिस्ट घोषणाओं से संबंधित एक प्रश्न में आया हूं।जावा ऐरेलिस्ट घोषणाएं

इनमें से कौन सी मान्य है ?:

1. ArrayList al1 = new ArrayList(); 
2. ArrayList al2 = new ArrayList<>(); 
3. ArrayList<> al3 = new ArrayList<>(); 
4. ArrayList<Double> al4 = new ArrayList<>(); 
5. ArrayList<Double> al5 = new ArrayList<Float>(); 

मेरी किताब के अनुसार, उत्तर देता 1,2 और 4 मान्य हैं। उत्तर 3 और 5 अमान्य हैं।

हालांकि, कोई उचित स्पष्टीकरण नहीं दिया गया है। सभी यह है एक ArrayList घोषित करने के लिए मानक रास्ता दिखा रहा है:

ArrayList<E> al3 = new ArrayList<E>(); 

और कहा गया है कि यह भी सामान्य हिस्सा बिना ArrayList घोषित करने के लिए मान्य है।

मैं इस विषय पर ऑनलाइन एक सभ्य लेख खोजने में असमर्थ हूं। क्या कोई उपरोक्त विभिन्न क्रमपरिवर्तनों को समझा सकता है (या मुझे एक अच्छे लेख की दिशा में इंगित करता है)?

अग्रिम धन्यवाद।

+2

कुछ जेनिक्स एसओ स्वरूपण द्वारा खाए जा रहे थे। – Vlad

+0

धन्यवाद मुझे बहुत उलझन में था: पी – cowls

+0

के बारे में 3. '<>' को 'हीरा ऑपरेटर' कहा जाता है और इसे 'जावा 7' के साथ पेश किया गया था। यह जेनेरिक ऑब्जेक्ट्स को इंस्टाल करने के लिए एक शॉर्टकट है, इसलिए आपको 'new' का उपयोग करते समय दूसरी बार टाइप निर्दिष्ट करने की आवश्यकता नहीं है क्योंकि यह पहले से ही परिवर्तनीय घोषणा में निर्दिष्ट है। – A4L

उत्तर

14

1 जावा

के सभी संस्करणों

यहाँ आप जेनेरिक्स का उपयोग किए बिना ArrayList की घोषणा कर रहे हैं में मान्य है। इसका अर्थ यह है कि जब आप इसे वापस प्राप्त करते हैं, तो आप एरेलिस्ट में जो भी जोड़ते हैं, उसके बावजूद यह Object प्रकार होगा और उसे एक प्रकार का कास्टिंग करने की आवश्यकता होगी। जावा 1.4 (प्री जेनरिक) में संग्रह का उपयोग करने का यह पुराना तरीका है और पिछली संगतता के लिए समर्थित है। आजकल आपको हमेशा जेनेरिक का उपयोग करना चाहिए। > < Java7 के नए प्रकार निष्कर्ष मतलब है कि आप प्रकार दो बार निर्दिष्ट करने के लिए की जरूरत नहीं है कर रहे हैं:


2 और 4 जावा 7 केवल

रिक्त कोष्ठक में मान्य हैं। नोट जावा 7, यह पुराने संस्करणों में काम नहीं करेगा। http://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html


3 अमान्य है क्योंकि अगर आप उपयोग कर रहे हैं:

तो Java7 में

ArrayList<Double> al4 = new ArrayList<>(); 

रूप

ArrayList<Double> al4 = new ArrayList<Double>(); 

यह लिंक प्रकार निष्कर्ष के बारे में अधिक जानकारी है एक ही है जेनेरिक आपको परिवर्तनीय घोषणा में एक प्रकार निर्दिष्ट करना होगा।


5, आप केवल यह प्रकार डबल की एक सूची प्रदान कर सकते हैं यदि आप प्रकार के साथ एक सूची की घोषणा डबल क्योंकि आप तो यह एक सूची प्रकार फ्लोट की है कि असाइन नहीं कर सकते अमान्य है।

तो यह वैध होगा:

ArrayList<Double> al5 = new ArrayList<Double>(); 
+0

आपके त्वरित और स्पष्ट उत्तर के लिए धन्यवाद। अब मुझे विश्वास है कि अगर मैं परीक्षा में आता हूं तो मैं एक समान सवाल संभाल सकता हूं। – user2123069

+0

कोई समस्या नहीं, परीक्षा के साथ शुभकामनाएँ – cowls

2

2 नीचे वैध only in Java SE7 हो जाएगा। जावा SE7 टाइप अनुमान को अनुमति देता है ताकि आपको <> के अंदर प्रकार प्रदान करने की आवश्यकता न हो।

ArrayList<Double> al4 = new ArrayList<>(); 
    ArrayList al2 = new ArrayList<>(); 

एक नीचे दूसरी ओर all Java versions पर मान्य है; यह गैर-जेनेरिक कोड की पिछड़े संगतता को सुनिश्चित करना है।

ArrayList al1 = new ArrayList(); 

नीचे फ्लोट का संग्रह के रूप में अनुमति नहीं है डबल के संग्रह की एक उप प्रकार नहीं है। इसके अलावा फ्लोट डबल का उप प्रकार नहीं है; इसलिए वैध घोषणा होने का कोई सवाल नहीं है। ध्यान दें कि सरणी संस्करण भी संकलित नहीं करता है।

Double[] dd = new Float[5]; //won't compile 
ArrayList<Double> al5 = new ArrayList<Float>(); //won't compile 

एक नीचे एक वैध घोषणा नहीं है।

ArrayList<> al3 = new ArrayList<>(); 
संबंधित मुद्दे