Caja de fundición de hash mapa

¿Cómo puedo seguridad lanzar un Mapa a un hash Mapa?

Quiero evitar clase elenco de excepción

HashMap<String, String> hMap;

public void setHashMap(Map map){
    hMap = (HashMap<String, String>) map;
}
¿Por qué setHashMap() requieren un Map cuando realmente necesita un HashMap?
¿Qué entiende usted por “seguridad”? ¿Qué desea que suceda cuando no se puede lanzar? Iba a hacer una copia aceptable?
Una librería externa que estoy usando es implementado usando un hashmap en lugar de una interfaz regular… 🙁
Supongo que sería, pero si puedo delegar a una biblioteca que sería ideal como el apache utils o algo

OriginalEl autor Stainedart | 2012-12-18

6 respuestas

  1. 25

    Si quieres hacer un (poco profundas) copia:

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

    Si quieres hacerlo solamente cuando no es ya un HashMap:

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

    OriginalEl autor Thilo

  2. 3

    En general, usted no puede encasillarse en un Map a un HashMap sin riesgos de clase a-reparto de excepción. Si el Map es un TreeMap, a continuación, el reparto (y debe) no.

    Puede evitar la excepción, haciendo uso de instanceof para comprobar el tipo antes de fundir, pero si la prueba dice que “no es un HashMap” usted está atascado. Usted no será capaz de hacer el reparto de trabajo.

    Las soluciones prácticas son:

    • declarar hMap como un Map no HashMap,
    • copia de la Map entradas en un recién creado HashMap, o
    • (puaj) crear una personalizada HashMap subclase que envuelve el mapa real.

    (Ninguno de estos métodos funcionan en todos los casos … pero no puedo hacer una recomendación específica, sin más detalles de lo que el mapa se utiliza para.)


    Y mientras estás en ello, podría ser apropiado para presentar un informe de error con los proveedores de la problemática de la biblioteca. Forzar el uso de un Mapa específico de la implementación es (en la cara de ella) es una mala idea.

    OriginalEl autor Stephen C

  3. 2

    Su función debe ser como la siguiente para evitar cualquier tipo de excepción como ClassCastException o NullPointerException. Aquí cualquier tipo de Map objeto será asignado a HashMap en el campo de la clase.

    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);
        }
    }

    OriginalEl autor Bhavik Ambani

  4. 0

    Que usted puede hacer:

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

    o simplemente rodean el elenco con un try/catch y la captura de la excepción cuando sucede.

    Asumiendo, por supuesto, que map no es un HashMap<Integer, Integer>, porque si es así, entonces sólo la comprobación instanceof HashMap no funciona. Llamadas como String s = map.get("foo") va a tirar la ClassCastException.

    OriginalEl autor palako

  5. 0

    Usted no debe yeso para HashMap! Fundición a la Mapa!

    Si usted realmente tiene una razón de tu pregunta, entonces, usted tiene que crear un nuevo HashMap en caso de que el Mapa no es un ejemplo de Mapa.

    Pero esto es una mala idea.

    OriginalEl autor AlexWien

  6. 0

    Si vas para siempre asumen que se trata de un HashMap<String, String>, ¿por qué no hacerlo?

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

    Si quieres algo más genérico que aceptará cualquier Map:

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

    Ningún casting necesario. Además, su ejemplo faltaba el tipo de retorno. He asumido que significa poner void.

    OriginalEl autor Brian

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *