java - metodos - HashMap(clave: String, valor: ArrayList) devuelve un objeto en lugar de ArrayList?
metodos arraylist java (5)
El método get
de HashMap
devuelve un Object
, pero se espera que la variable current
tome ArrayList
:
ArrayList current = new ArrayList();
// ...
current = dictMap.get(dictCode);
Para que funcione el código anterior, el Object
debe convertirse en una ArrayList
:
ArrayList current = new ArrayList();
// ...
current = (ArrayList)dictMap.get(dictCode);
Sin embargo, probablemente la mejor forma sería usar 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 supone que ArrayList
tiene una lista de Object
s, y que se debe cambiar según sea necesario.
Para obtener más información sobre los genéricos, The Java Tutorials tiene una lección sobre genéricos .
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.
ArrayList current = new ArrayList();
if(dictMap.containsKey(dictCode)) {
current = dictMap.get(dictCode);
}
La línea "current = ..." devuelve un error de compilación de:
Error: incompatible types
found : java.lang.Object
required: java.util.ArrayList
No entiendo esto ... ¿ese HashMap devuelve un Objeto en lugar de la ArrayList que almacené en él como valor? ¿Cómo convierto este objeto en una ArrayList?
Gracias.
Supongo que tu dictMap es de tipo HashMap
, lo que lo convierte en HashMap<Object, Object>
. Si quieres que sea más específico, HashMap<String, ArrayList>
como HashMap<String, ArrayList>
, o incluso mejor, como HashMap<String, ArrayList<T>>
Usar genéricos (como en las respuestas anteriores) es su mejor apuesta aquí. Acabo de verificar dos veces y:
test.put("test", arraylistone);
ArrayList current = new ArrayList();
current = (ArrayList) test.get("test");
también funcionará, ya que no lo recomendaría, ya que los genéricos garantizan que solo se agreguen los datos correctos, en lugar de intentar realizar el manejo en el momento de la recuperación.
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 ... tal vez encuentres tu error en mi código.
¿Cómo se expresa la declaración de HashMap en ese ámbito? Debería ser:
HashMap<String, ArrayList> dictMap
Si no, se supone que son Objetos.
Por ejemplo, si su código es:
HashMap dictMap = new HashMap<String, ArrayList>();
...
ArrayList current = dictMap.get(dictCode);
eso no funcionará. En cambio, quieres:
HashMap<String, ArrayList> dictMap = new HashMap<String, Arraylist>();
...
ArrayList current = dictMap.get(dictCode);
La forma en que funcionan los genéricos es que la información de tipo está 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. Ver la documentación de Generics .
También tenga en cuenta que ArrayList
también se implementa como una clase genérica, y por lo tanto, es posible que desee especificar un tipo allí también. Suponiendo que su ArrayList
contiene su clase MyClass
, la línea anterior podría ser:
HashMap<String, ArrayList<MyClass>> dictMap