2012-12-18 15 views
6

Come posso trasmettere in modo sicuro una mappa a una mappa hash?Trasmissione sicura a mappa hash

voglio evitare eccezione calco

HashMap<String, String> hMap; 

public void setHashMap(Map map){ 
    hMap = (HashMap<String, String>) map; 
} 
+3

Perché 'setHashMap()' richiede un 'Map' quando ha veramente bisogno di un' HashMap'? –

+0

Cosa intendi con "sicuro"? Cosa vuoi che succeda quando non può essere lanciato? Fare una copia sarebbe accettabile? – Thilo

+0

Una libreria esterna che sto usando è implementata usando una hashmap invece di un'interfaccia regolare ... :( – Stainedart

risposta

17

Se si vuole fare una (superficiale) copia:

HashMap<String, String> copy = new HashMap<String, String>(map); 

Se si vuole fare questo solo quando non è già un HashMap :

HashMap<String, String> hashMap = 
    (map instanceof HashMap) 
     ? (HashMap) map 
     : new HashMap<String, String>(map); 
0

si può fare:

if (map instanceof HashMap) { 
    hMap = (HashMap<String, String>) map; 
} else { 
    //do whatever you want instead of throwing an exception 
} 

o semplicemente circondare il cast con un try/catch e catturare l'eccezione quando succede.

+0

Supponendo Certo che 'map' non è un' HashMap ', perché se lo è, allora il solo controllo di' instanceof HashMap' non funzionerà.Qualsiasi chiamata come 'String s = map.get (" foo ") 'getterà il' ClassCastException'. – Brian

0

Non si dovrebbe trasmettere a HashMap! Trasmetti per mappare!
Se hai davvero un motivo per la tua domanda, allora devi creare una nuova HashMap nel caso in cui Map non sia un'istanza di Map.
Ma questa è una cattiva idea.

2

La tua funzione dovrebbe essere la seguente per evitare qualsiasi tipo di eccezione come ClassCastException o NullPointerException. Qui qualsiasi tipo di oggetto Map verrà assegnato a HashMap nel proprio campo della classe.

public void setHashMap(Map<String, String> map) { 

    if (map != null && map instanceof HashMap<?, ?>) { 
     hMap = (HashMap<String, String>) map; 
    } else if (map != null) { 
     hMap.putAll(map); 
    } 
} 
0

Se avete intenzione di assumere sempre che si tratta di un HashMap<String, String>, perché non farlo?

HashMap<String, String> hMap; 

public void setHashMap(HashMap<String, String> map){ 
    hMap = map; 
} 

Se volete qualcosa di più generico che accetterà qualsiasi Map:

public void setHashMap(Map<String, String> map){ 
    if (map != null) 
     hMap = new HashMap<String, String>(map); 
    else 
     hMap = new HashMap<String, String>(); 
} 

No fusione richiesto. Inoltre, nel tuo esempio mancava il tipo di reso. Ho assunto che intendevi inserire void.

2

In generale, non è possibile digitare un Map a HashMap senza il rischio di un'eccezione di classe. Se lo Map è un TreeMap, il cast verrà (e deve) fallire.

È possibile evitare l'eccezione facendo utilizzando instanceof per verificare il tipo prima di lanci, ma se il test dice che "non un HashMap" si sono bloccati. Non sarai in grado di far funzionare il cast.

Le soluzioni pratiche sono:

  • dichiarano hMap come non Map un HashMap,
  • copiare i Map voci in una nuova creazione HashMap, o
  • (bleah) creare una sottoclasse HashMap personalizzato avvolge la mappa reale.

(nessuno di questi approcci funzionerà in tutti i casi ...ma non riesco a fare una raccomandazione specifica senza ulteriori dettagli di ciò che la mappa è utilizzato per.)


E mentre si è in esso, potrebbe essere opportuno presentare un bug report con i fornitori della problematica biblioteca. Costringervi a utilizzare un'implementazione di mappa specifica è (a prima vista) una cattiva idea.

Problemi correlati