2012-02-16 22 views
7

के रूप में एक सी ++ Oldtimer मैं अपने समस्या को हल करने में कामयाब रहे, लेकिन मैं यहाँ अंतर्निहित जावा तंत्र के आसपास मेरे सिर लपेटो नहीं कर सकते हैं:जावा सूची बनाम ArrayList

Vector<Object> x = new Vector<Object>();  // OK 
ArrayList<Object> y = new ArrayList<Object>(); // OK 
List<Object> zzz = new ArrayList<Object>();  // OK solves problem below but question remains 
List<Object> z = new List<Object>();   // WHY? Compiler error: Cannot instantiate 

उत्तर

14

List, एक अंतरफलक है कुछ हद तक कुछ के साथ एक वर्ग की तरह सी ++ में = 0 विधियां। आप इसे तुरंत चालू नहीं कर सकते हैं।

लेकिन ArrayList<T> "विरासत" List<T> (या जावा शब्दों में, इसे लागू करता है), इसलिए वे संदर्भ असाइनमेंट-संगत हैं।

+0

आप सभी को धन्यवाद। – Adam

+0

आप लोग वास्तव में तेज़ हैं – Adam

+0

@Adam - जावा जेनेरिक में वाइल्डकार्ड तक पहुंचने तक प्रतीक्षा करें! :) उत्तर प्रकट होने में थोड़ा लंबा समय लगता है। –

5

सूची एक इंटरफ़ेस है, आप इसे प्रारंभ नहीं कर सकते हैं। ArrayList लागू List, इसलिए आप ArrayList उदाहरण List चर पर असाइन कर सकते हैं।

1

सूची कक्षा नहीं है यह एक इंटरफ़ेस है और आप इंटरफ़ेस ऑब्जेक्ट को तुरंत चालू नहीं कर सकते हैं।

ArrayList वर्ग था जो सूची इंटरफ़ेस तो एक अंतरफलक है ArrayList वस्तु का दृष्टांत और सूची वस्तु

1

List को प्रदान करने में सक्षम कर सकते हैं लागू है। आप new ऑपरेटर का उपयोग कर इंटरफ़ेस के उदाहरण में नहीं बना सकते हैं। यही कारण है कि लाइन List<Object> z = new List<Object>(); त्रुटि देता है। केवल कक्षाओं को तत्काल किया जा सकता है।

0

List एक interface है और एक इंटरफ़ेस को तत्काल नहीं किया जा सकता है।

इसका उपयोग पॉलिमॉर्फिज्म को लागू करने के लिए किया जाता है। यानी इंटरफ़ेस प्रकार का संदर्भ किसी भी वर्ग की ऑब्जेक्ट रख सकता है जो implements है।

List<Object> zzz = new ArrayList<Object>(); 

यह काम करता है, क्योंकि ऐरेलिस्ट सूची लागू करता है।

1

"इंटरफ़ेस" प्रोटोकॉल की तरह है जिसे किसी ऑब्जेक्ट का अनुपालन करना चाहिए।

+0

समानता के रूप में प्रोटोकॉल का उपयोग करने के लिए दिलचस्प दृष्टिकोण। यद्यपि थोड़ा और अधिक पाठ "यह" क्या है और चीजें थोड़ा स्पष्ट क्यों नहीं हो सकती हैं। –

+1

मैंने इस संदर्भ में प्रोटोकॉल कभी नहीं सुना। लेकिन मैं समझता हूं कि आपका क्या मतलब है। मैं अनुबंध अनुबंध पसंद करता हूं: http://en.wikipedia.org/wiki/Design_by_contract – Adam

+0

@Adam मैं सहमत हूं, अनुबंध एक बेहतर शब्द है। – Benjamin

2

हां। क्योंकि सूची एक इंटरफ़ेस है और जावा में आप इंटरफ़ेस को तुरंत चालू नहीं कर सकते हैं। आप केवल एक कक्षा को तुरंत चालू कर सकते हैं।

ऐरेलिस्ट एक वर्ग है जो सूची < को कार्यान्वित कर रहा है> यही कारण है कि आप इसे तुरंत चालू कर सकते हैं। :)

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