2012-06-24 51 views
13

可能重複:
Java.util.HashMap — why HashMap extends AbstractMap and implement Map?爲什麼HashMap在擴展AbstractMap時實現Map?

在Java中實現HashMap<K,V>我們需要實現Map<K,V>

但是,當我在java類中調試更多時,似乎.... java定義了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

也許當它在Java 1.2的實現,即使超類已經IMO實現的接口所需要的類設計。 –

+0

請參閱[this](http://stackoverflow.com/questions/11028542/why-does-atomicinteger-implements-serializable)。它指出了類似的情況 –

+1

是的......它應該作爲副本關閉。 –

回答

1

我相信這背後的原因是Java中的抽象類不需要聲明/實現接口中的所有方法。 因此

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() {} 
    } 

它可以重寫如下太:

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

沒有理由這樣做,如果一個抽象類實現了一個接口,它不必實現所有的方法,那麼擴展抽象類__必須實現的第一個「非抽象」類必須實現「未實現」的方法。 –

+0

這正是我的觀點。 – Baz1nga

6

這可能只是爲了讓事情更加明顯。你基本上可以直接從該類的代碼中看到HashMap實現Map接口。是的,它已經擴展了AbstractMap,但這可能只是一個實現細節。

再次實現接口沒有任何問題。這並不會改變代碼的編譯方式,但它確實有幫助,因爲您可以立即看到它。您不必爬上類層次結構或首先加載API文檔。

3

「implements Map」是可選的,通常用於幫助人們閱讀HashMap實現Map的接口方法和AbstractMap的抽象方法的代碼。

6

在這個特殊情況下,它純粹是爲了文檔的目的;即向讀者說清楚這 a Map的實現。我很確定這一點冗餘的成本可以忽略不計。

(是的,你的理解是正確的。)

相關問題