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;
}
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;
}
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);
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.
Supponendo Certo che 'map' non è un' HashMap
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.
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);
}
}
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
.
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:
hMap
come non Map
un HashMap
,Map
voci in una nuova creazione HashMap
, o(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.
Perché 'setHashMap()' richiede un 'Map' quando ha veramente bisogno di un' HashMap'? –
Cosa intendi con "sicuro"? Cosa vuoi che succeda quando non può essere lanciato? Fare una copia sarebbe accettabile? – Thilo
Una libreria esterna che sto usando è implementata usando una hashmap invece di un'interfaccia regolare ... :( – Stainedart