2012-12-18 10 views
6

Wie kann ich eine Map sicher auf eine Hash-Map übertragen?Sichere Umwandlung in Hash-Karte

I Klasse Guss Ausnahme

HashMap<String, String> hMap; 

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

Warum sollte 'setHashMap()' eine 'Map' erfordern, wenn wirklich eine' HashMap' benötigt wird? –

+0

Was meinst du mit "sicher"? Was möchtest du tun, wenn es nicht gegossen werden kann? Wäre eine Kopie akzeptabel? – Thilo

+0

Eine externe Bibliothek, die ich benutze, wird mit einer Hashmapp anstelle einer regulären Schnittstelle implementiert ... :( – Stainedart

Antwort

17

vermeiden wollen Wenn Sie eine (flache) machen wollen kopieren:

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

Wenn Sie nur dies tun wollen, wenn es nicht bereits eine HashMap ist :

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

Sie tun können:

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

oder einfach die Besetzung mit einem try/catch umgeben und die Ausnahme erfassen, wenn es passiert.

+0

Angenommen von Natürlich ist 'map' kein' HashMap ', denn wenn das der Fall ist, wird' instanceof HashMap' nicht funktionieren. Alle Aufrufe wie 'String s = map.get (" foo ") 'wirft die' ClassCastException'. – Brian

0

Sie sollten nicht auf HashMap! Auf Karte umwandeln!
Wenn Sie wirklich einen Grund für Ihre Frage haben, müssen Sie eine neue HashMap erstellen, falls Map keine Instanz von Map ist.
Aber das ist eine schlechte Idee.

2

Ihre Funktion sollte wie folgt sein, um jede Art von Ausnahme wie ClassCastException oder NullPointerException zu vermeiden. Hier wird jede Art von Map Objekt HashMap in Ihr Feld der Klasse zugeordnet.

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

Wenn du immer gehst davon aus, dass es sich um ein HashMap<String, String> ist, warum dies nicht nur tun?

HashMap<String, String> hMap; 

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

Wenn Sie etwas allgemeinere wollen, dass jeder Map akzeptieren:

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

Kein Casting erforderlich. In Ihrem Beispiel fehlte auch der Rückgabetyp. Ich habe angenommen, dass Sie void setzen wollten.

2

Im Allgemeinen können Sie keine Map in eine HashMap ohne Risiko einer Klassenausnahme schreiben. Wenn die Map eine TreeMap ist, dann wird (und muss) der Cast fehlschlagen.

können Sie vermeiden die Ausnahme unter Verwendung instanceof machen die Art zu überprüfen, bevor Sie werfen, aber wenn der Test sagt „kein HashMap“ Sie stecken bleiben. Du kannst die Besetzung nicht arbeiten lassen.

Die praktischen Lösungen sind:

  • erklären hMap als Map kein HashMap,
  • die Map Einträge in eine neu erstellte Kopie HashMap oder
  • (igitt) erstellen Sie eine benutzerdefinierte HashMap Unterklasse, die umschließt die echte Karte.

(Keiner dieser Ansätze wird in allen Fällen funktionieren ...aber ich kann nicht eine spezifische Empfehlung, ohne weitere Einzelheiten machen, was die Karte für verwendet wird.)


Und während Sie gerade dabei sind, könnte es angemessen sein, einen Fehlerbericht mit den Anbietern der problematischen einreichen Bibliothek. Sie zu zwingen, eine bestimmte Map-Implementierung zu verwenden, ist (auf den ersten Blick) eine schlechte Idee.