2012-06-24 12 views
13

संभव डुप्लिकेट:
Java.util.HashMap — why HashMap extends AbstractMap and implement Map?हैश मैप मानचित्र को कार्यान्वित क्यों करता है यदि यह सार मैप बढ़ाता है?

जावा में HashMap<K,V> हम Map<K,V> लागू करने की आवश्यकता को लागू करने।

हालांकि जब मैंने जावा कक्षाओं में अधिक डीबग किया तो ऐसा लगता है कि .... जावा HashMap कक्षा को निम्नानुसार परिभाषित करता है।

public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable

एक ही समय मैं public abstract class AbstractMap<K,V> देखा पर Map<K,V> यह भी इंटरफ़ेस Map<K,V> लागू करता है लागू करता है।

यदि सार वर्ग इंटरफ़ेस लागू करता है, तो Map<K,V>HashMap कक्षा स्तर पर लागू करने का कारण क्या है?

मेरी समझ के अनुसार HashMap कक्षा में AbstractMap से विरासत में सभी विधियां हैं जिन्हें आवश्यकता के अनुसार HashMap द्वारा ओवरराइड किया जा सकता है।

+3

शायद। –

+0

देखें [यह] (http://stackoverflow.com/questions/11028542/why-does-atomicinteger-implements-serializable)। यह इसी तरह की स्थिति को इंगित करता है –

+1

हां ... इसे डुप्लिकेट के रूप में बंद किया जाना चाहिए। –

उत्तर

1

मेरा मानना ​​है कि इस के पीछे तर्क जावा में एक सार वर्ग है, इंटरफ़ेस में सभी विधियों को घोषित/कार्यान्वित करने की आवश्यकता नहीं है। इस प्रकार

public interface MyInterface{ 
    void a(); 
    void b(); 
    void c(); 
} 

इंटरफेस के निम्नलिखित सार कार्यान्वयन मान्य है।

public abstract class AbstractClass implements MyInterface { 
    public void a() {} 
    public void c() {} 
    public void d() {} 
} 

इस प्रकार मेरा मानना ​​है कि आदेश HashMap सार वर्ग द्वारा लागू नहीं किया तरीकों को लागू करने के बारे में स्पष्ट होने के लिए यह इंटरफ़ेस Map लागू करने के लिए, जबकि यह इसलिए है क्योंकि ऐसा करने के लिए पूरी तरह से वैकल्पिक है दिखाया गया है अमूर्त वर्ग की जरूरत के किसी भी कार्यान्वयन सार वर्ग के लिए एक वैध कार्यान्वयन ऊपर के उदाहरण में इस प्रकार या तो सार वर्ग या व्युत्पन्न आधार वर्ग में सभी तरीकों को लागू करने के ..

public class MyClass extends Abstract{ 
     public void a() {} 
     public void c() {} 
     public void b() {} //if you dont implement this, compile error 
     public void d() {} 
    } 

जो आप के रूप में फिर से लिखने कर सकते हैं भी इस प्रकार है:

012,
public class MyClass extends Abstract implements MyInterface { 
     public void a() {} 
     public void c() {} 
     public void b() {} 
     public void d() {} 
    } 
+4

ऐसा करने का कोई कारण नहीं है, यदि कोई सार वर्ग किसी इंटरफ़ेस को लागू करता है तो उसे सभी विधियों को लागू करने की आवश्यकता नहीं होती है, अमूर्त वर्ग __must__ को विस्तारित करने वाली पहली "गैर-सार" कक्षा को "लागू नहीं" विधियों को लागू करना होता है। –

+0

जो बिल्कुल मेरी बात थी .. – Baz1nga

6

शायद यह चीजों को और अधिक स्पष्ट बनाने के लिए है। आप मूल रूप से सीधे उस एकल वर्ग के कोड से देख सकते हैं जो HashMapMap इंटरफ़ेस लागू करता है। हां, यह पहले से ही AbstractMap बढ़ाता है, लेकिन शायद यह केवल एक कार्यान्वयन विस्तार माना जाता है।

इंटरफ़ेस को फिर से कार्यान्वित करने में कुछ भी गलत नहीं है। यह नहीं बदलता कि कोड कैसे संकलित किया गया है, लेकिन यह निश्चित रूप से मदद करता है क्योंकि आप इसे तुरंत देखते हैं। आपको कक्षा पदानुक्रम पर चढ़ना या पहले एपीआई दस्तावेज़ लोड करना नहीं है।

3

"लागू नक्शा" वैकल्पिक है और आमतौर पर ऐसे लोगों को पढ़ने में लोगों की मदद करने के लिए है जो हैश मैप मानचित्र के इंटरफ़ेस विधियों के साथ-साथ सारचित्र मैप के सार तरीकों को लागू करता है।

6

इस विशेष मामले में, यह पूरी तरह से दस्तावेज़ीकरण उद्देश्यों के लिए है; अर्थात।पाठक को यह स्पष्ट करने के लिए कि यह Map कार्यान्वयन है। मुझे यकीन है कि इस अनावश्यकता में नगण्य लागत है।

जब यह जावा 1.2 वर्ग भले ही सुपर वर्ग पहले से ही लागू किया IMO इंटरफ़ेस को लागू करने के लिए आवश्यक में डिजाइन किया गया था (और, हाँ, अपनी समझ से सही है।)

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