2012-06-24 11 views
13

Powiel możliwe:
Java.util.HashMap — why HashMap extends AbstractMap and implement Map?Dlaczego aplikacja HashMap implementuje Map, jeśli rozszerza AbstractMap?

w Javie do wdrożenia HashMap<K,V> musimy wdrożyć Map<K,V>.

Jednak gdy debugowałem więcej w klasach java, wydaje się, że .... java definiuje klasę HashMap w następujący sposób.

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

Jednocześnie widziałem public abstract class AbstractMap<K,V> realizuje Map<K,V> również implementuje interfejs Map<K,V>.

Jeśli więc klasa abstrakcyjna implementuje interfejs, jaki jest powód wdrożenia Map<K,V> na poziomie klasy Map<K,V>?

Zgodnie z moją wiedzą klasa HashMap ma wszystkie metody odziedziczone po AbstractMap, które mogą zostać zmienione przez HashMap zgodnie z wymaganiami.

+3

Może kiedy został zaprojektowany w Javie 1.2 klasy potrzebne do wdrożenia interfejsu nawet jeśli super klasa już wdrożony IMO. –

+0

Zobacz [to] (http://stackoverflow.com/questions/11028542/why-does-atomicinteger-implements-serializable). Podkreśla podobną sytuację. –

+1

Tak ... powinien być zamknięty jako duplikat. –

Odpowiedz

1

Wierzę, że rozumowanie stojące za tym jest klasa abstrakcyjna w Javie nie musi deklarować/implementować wszystkich metod w interfejsie. Zatem

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

następujące streszczenie implementacja interfejsu jest nieprawidłowy.

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

Zatem wierzę, aby być jawne o HashMap wykonawczego metody nie realizowane przez klasy abstrakcyjnej jest ono pokazane na implementować interfejs Map natomiast jest całkowicie opcjonalne, aby to zrobić, ponieważ każda realizacja abstrakcyjnych potrzeb klasowych wdrożyć wszystkie metody zarówno w abstrakcyjnej klasy lub pochodnej klasy bazowej .. Zatem w powyższym przykładzie poprawną realizację do klasy abstrakcyjnej jest

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

których można przepisać następująco też:

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

Nie ma powodu, aby to zrobić, jeśli klasa abstrakcyjna implementuje interfejs, który nie musi implementować wszystkich metod, pierwsza "nie abstrakcyjna" klasa rozszerzająca abstrakcyjną klasę __must__ musi implementować metody "nie zaimplementowane". –

+0

co było dokładnie moim punktem ... – Baz1nga

6

To chyba tylko po to, aby sprawy stały się bardziej oczywiste. Zasadniczo można bezpośrednio zobaczyć z kodu tej pojedynczej klasy, który HashMap implementuje interfejs Map. Tak, to już rozszerza się na AbstractMap, ale to jest prawdopodobnie tylko szczegół implementacji.

Nie ma nic złego w ponownym wdrażaniu interfejsów. Nie zmienia to sposobu kompilacji kodu, ale zdecydowanie pomaga, ponieważ widzisz go natychmiast. Nie musisz wspinać się po hierarchii klas lub ładować najpierw dokumentów API.

3

"Mapa implementacji" jest opcjonalna i zwykle służy pomocą ludziom czytającym kod, który HashMap implementuje metody interfejsu Map, a także abstrakcyjne metody AbstractMap.

6

W tym konkretnym przypadku służy wyłącznie do celów dokumentacyjnych; to znaczyw celu wyjaśnienia czytelnikowi, że ta implementacja jest a Map. Jestem prawie pewny, że w tej odrobinie nadmiarowości są znikome koszty.

(I tak, zrozumienie jest poprawna.)

Powiązane problemy