2015-05-01 19 views
6

Klasa HashMap implementuje interfejs Mapa:Dlaczego klasa LinkedHashMap implementuje interfejs mapy?

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

Klasa LinkedHashMap rozciąga HashMap to znaczy powinna ona realizować interfejs Mapa domyślnie. Dlaczego implementuje interfejs Map?

public class LinkedHashMap<K,V> 
extends HashMap<K,V> 
implements Map<K,V> 
+0

@Radiodef: Dzięki! –

Odpowiedz

5

Masz rację: upuszczenie Map<K,V> z deklaracją przyłączonego hash mapie nie zmieniłbym niczego. Chociaż LinkedHashMap<K,V> zaimplementowałby Map<K,V> po prostu dlatego, że rozszerza HashMap<K,V>, fakt, że powiązana mapa hash pochodzi od zwykłej mapy hash, jest szczegółem implementacji, a nie trudnym wymaganiem.

Implementacja interfejsu Map<K,V> jest z kolei podstawowym wymogiem. Wymaganie to nie zniknie, jeśli projektanci zdecydują się wdrożyć od podstaw LinkedHashMap<K,V> lub polegać na innej klasie bazowej, np. połączona lista.

Dlatego projektanci LinkedHashMap<K,V> wspomniano Map<K,V> wyraźnie: jeśli w jakimś późniejszym dniu klasa bazowa zmieniłaby się z powodu przeprojektowania, interfejs pozostałby na miejscu.

4

Cóż, prawdopodobnie jest to ze względu na jasność w dokumentacji, nie dodaje nic do kodu. Może to być również spowodowane tym, że LinkedHashMap extends HashMap jest szczegółem implementacji, co jest naprawdę ważne, aby wiedzieć, że LinkedHashMap jest Map.

3

Praktycznie nie ma różnicy. Moim zdaniem tak było zawsze w klasach JDK (ten sam schemat istnieje dla List i jego podklas). Projektanci prawdopodobnie nadal nie usunęli tej redundantnej implementacji, aby nic nie zepsuło się na przykład, gdy ktoś polega na odbiciu, aby uzyskać informacje o podtypach. Na przykład wyobrazić zdefiniować następujące:

class MyCustomMap<K, V> extends LinkedHashMap<K, V> implements Map<K, V> { 

} 

wówczas poniżej urywek Daje na wyjściu różne wyniki zi bez implements:

Class<?>[] interfaces = MyCustomMap.class.getInterfaces(); 
for (int i = 0; i < interfaces.length; i++) { 
    System.out.println(interfaces[i]); 
} 

wyjściowy:

interfejsu java.util. Mapa

Zmiana definicję:

class MyCustomMap<K, V> extends LinkedHashMap<K, V> { 

} 

następnie bez interfejsu będzie drukowany.

+0

Interesujący pomysł, ale czy spróbowałeś tego samego bez "implementuje mapę"? Możesz to łatwo symulować – Dici

+0

@Dici Bez "narzędzi", na wyjściu nie jest wyświetlany żaden interfejs. – manouti

+0

Ok, miłe miejsce! +1 – Dici

1

Dici ma to prawo, w przeważającej części.

Dawno temu niektóre z mniejszych kompilatorów Javy mogły się nieco zagubić i od czasu do czasu dodałem (do mojego kodu) interfejsy, które powinny być wyprowadzone z nadrzędnej hierarchii. Być może to miało wpływ na umieszczenie interfejsu w wielu miejscach (dla bibliotek Java), ale to jest czysta spekulacja.