2009-06-06 6 views
5

Estoy almacenando datos en un HashMap con (clave: Cadena, valor: ArrayList). La parte con la que estoy teniendo problemas declara una nueva ArrayList "actual", busca HashMap para la cadena "dictCode" y, si la encuentra, la establece como el valor devuelto ArrayList.HashMap (clave: String, valor: ArrayList) devuelve un objeto en lugar de ArrayList?

ArrayList current = new ArrayList();  
if(dictMap.containsKey(dictCode)) { 
    current = dictMap.get(dictCode); 
} 

La "corriente = ..." línea devuelve un error de compilación de:

Error: incompatible types 
found : java.lang.Object 
required: java.util.ArrayList 

No entiendo esto ... hace que HashMap devolver un objeto en lugar de ArrayList Almacené en ella como el valor? ¿Cómo convierto este objeto en una ArrayList?

Gracias.

+0

agregue la declaración de HashMap para aclarar la pregunta. – Jorn

Respuesta

33

¿Cómo se expresa la declaración de HashMap en ese ámbito? Debería ser:

HashMap<String, ArrayList> dictMap 

De lo contrario, se asume que son Objetos.

Por ejemplo, si su código es:

HashMap dictMap = new HashMap<String, ArrayList>(); 
... 
ArrayList current = dictMap.get(dictCode); 

que no funciona. Por el contrario desea:

HashMap<String, ArrayList> dictMap = new HashMap<String, Arraylist>(); 
... 
ArrayList current = dictMap.get(dictCode); 

La forma genéricos trabajo es que la información de tipo se encuentra disponible para el compilador, pero no está disponible en tiempo de ejecución. Esto se llama borrado de tipo. La implementación de HashMap (o cualquier otra implementación de genéricos) se relaciona con Object. La información de tipo está allí para las comprobaciones de seguridad de tipo durante el tiempo de compilación. Vea el Generics documentation.

También tenga en cuenta que ArrayList también se implementa como una clase genérica y, por lo tanto, es posible que también desee especificar un tipo allí. Asumiendo que su ArrayList contiene la clase de MyClass, la línea anterior podría ser:

HashMap<String, ArrayList<MyClass>> dictMap 
2

supongo que su dictMap es de tipo HashMap, lo que lo hace por defecto a HashMap<Object, Object>. Si desea que sea más específico, gírelo como HashMap<String, ArrayList>, o mejor aún, como HashMap<String, ArrayList<T>>

+0

Gracias ... ¿qué hace el ArrayList > bit do? – cksubs

+0

Declara el tipo de objetos en el ArrayList, al igual que los parámetros en el HashMap declaran el tipo de clave String y el tipo de valor List. Deberías reemplazar T con el tipo de objetos en la Lista – Jorn

2

Usar medicamentos genéricos (como en las respuestas anteriores) es su mejor opción aquí. He comprobado dos veces y:

test.put("test", arraylistone); 
    ArrayList current = new ArrayList(); 
    current = (ArrayList) test.get("test"); 

funcionará tan bien, a través de que no lo recomendaría como los genéricos asegurar que sólo se añade la información correcta, en lugar de tratar de hacer el tratamiento en el tiempo de recuperación.

2

El método de la HashMapget devuelve un Object, pero se espera que la variable current tomar un ArrayList:

ArrayList current = new ArrayList(); 
// ... 
current = dictMap.get(dictCode); 

Para el código anterior funcione, el Object deberán ser emitidos a un ArrayList:

ArrayList current = new ArrayList(); 
// ... 
current = (ArrayList)dictMap.get(dictCode); 

Sin embargo, probablemente la mejor manera sería utilizar objetos de colección genéricos en primer lugar:

HashMap<String, ArrayList<Object>> dictMap = 
    new HashMap<String, ArrayList<Object>>(); 

// Populate the HashMap. 

ArrayList<Object> current = new ArrayList<Object>();  
if(dictMap.containsKey(dictCode)) { 
    current = dictMap.get(dictCode); 
} 

El código anterior es suponiendo que la ArrayList tiene una lista de Object s, y que debe cambiarse según sea necesario.

Para obtener más información sobre genéricos, los Tutoriales de Java tienen un lesson on generics.

10
public static void main(String arg[]) 
{ 
    HashMap<String, ArrayList<String>> hashmap = 
     new HashMap<String, ArrayList<String>>(); 
    ArrayList<String> arraylist = new ArrayList<String>(); 
    arraylist.add("Hello"); 
    arraylist.add("World."); 
    hashmap.put("my key", arraylist); 
    arraylist = hashmap.get("not inserted"); 
    System.out.println(arraylist); 
    arraylist = hashmap.get("my key"); 
    System.out.println(arraylist); 
} 

null 
[Hello, World.] 

Funciona bien ... quizás encuentre su error en mi código.

Cuestiones relacionadas