2015-05-01 16 views
6

classe HashMap implementa l'interfaccia Map:Perché la classe LinkedHashMap implementa l'interfaccia Mappa?

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

Classe LinkedHashMap estende HashMap che significa che dovrebbe implementare l'interfaccia Map per impostazione predefinita. Perché sta implementando esplicitamente l'interfaccia Mappa?

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

@Radiodef: Grazie! –

risposta

5

Hai ragione: far cadere Map<K,V> dalla dichiarazione legata della mappa di hash non cambierebbe nulla. Anche se LinkedHashMap<K,V> implementerebbe Map<K,V> semplicemente perché estende HashMap<K,V>, il fatto che la mappa hash collegata derivi da una normale mappa di hash è un dettaglio di implementazione, non un requisito severo.

L'implementazione dell'interfaccia Map<K,V>, d'altra parte, è un requisito fondamentale. Questo requisito non scomparirebbe se i progettisti decidessero di implementare lo LinkedHashMap<K,V> da zero o di fare affidamento su qualche altra classe base, ad es. una lista collegata.

Questo è il motivo per cui i progettisti di LinkedHashMap<K,V> hanno menzionato lo Map<K,V> esplicitamente: se in un secondo momento una classe base dovesse cambiare a causa della riprogettazione, l'interfaccia rimarrebbe al suo posto.

4

Bene, è probabilmente per chiarezza nella documentazione, non aggiunge nulla al codice. Potrebbe anche essere che LinkedHashMap extends HashMap è un dettaglio di implementazione, ciò che è davvero importante sapere è che LinkedHashMap è un Map.

3

Praticamente non c'è differenza. A mio parere, è sempre stato il caso nelle classi JDK (lo stesso modello esiste per List e le sue sottoclassi). Probabilmente i progettisti non hanno ancora rimosso questa implementazione ridondante in modo che nulla si interrompa nel caso in cui, per esempio, qualcuno si affidi alla riflessione per ottenere informazioni sui sottotipi. Per esempio immaginate di definire il seguente:

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

} 

Poi le uscite seguente snippet risultati diversi con e senza il implements:

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

uscita:

interfaccia java.util. Mappa

Cambiare la definizione di:

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

} 

quindi alcuna interfaccia sarebbe da stampare.

+0

Idea interessante, ma hai provato la stessa cosa senza la "mappa degli attrezzi"? È possibile simularlo facilmente – Dici

+0

@Dici Senza 'implements', non viene mostrata alcuna interfaccia nell'output. – manouti

+0

Ok, bel posto! +1 – Dici

1

Dici ha ragione, per la maggior parte.

Molto tempo fa, alcuni dei compilatori Java minori potevano essere un po 'confusi e ogni tanto aggiungevo (al mio codice) interfacce che avrebbero dovuto essere derivate dalla gerarchia madre. Forse questo ha contribuito a mettere l'interfaccia in più punti (per le librerie Java) ma questa è pura speculazione.

Problemi correlati