2010-12-13 17 views
6

Necesito un mapa donde los valores sean de diferentes tipos, como entero, cadena, etc. El problema con Java es que las primitivas aquí no son Object s, lo que sugiere que no es posible tener un diccionario híbrido. Quiero confirmar esto¿Hay algún diccionario que acepte valores de varios tipos de datos?

+0

vea también http://stackoverflow.com/questions/2001755/using-int-as-a-type-parameter-for-java-util-dictionary – Fortega

+1

Es posible que desee compartir más de su diseño para comentarios. En mi experiencia, el uso de diferentes tipos de valores en un mapa a menudo es un signo de un diseño menos que óptimo. –

+0

Quiero un generador de registros JSON que pueda crear un árbol, basado solo en el mensaje en lugar de convertirlo en una clase objetivo determinada. Así que quiero un diccionario (diccionario o mapa, cualquiera que sea el nombre) o una lista como salida, como dice Jon Skeet asumiendo el boxeo automático en Java. También suponiendo que hay una buena biblioteca de serialización-deserialización de JSON que hace esto. Gson, por ejemplo, necesita un tipo en el que el mensaje se deserialice. Por lo tanto, Gson no es útil para mí. Espero que entiendas mi problema. – ada

Respuesta

1

Puede explotar el autoboxing y usar Integer en lugar de int, etc.

Los tipos correspondientes (Integer, Double, Bool, ...) heredar objeto, por lo que podría utilizar un estándar Map<Object, Whatever> y tirar cosas arbitraria en ella.

8

Parece que solo quiere un Map<String, Object> (o cualquiera que sea su tipo de clave).

Los valores primitivos serán en caja apropiada:

Map<String, Object> map = new HashMap<String, Object>(); 

map.put("int", 20); 
map.put("long", 100L); 
// etc 

Tenga en cuenta que con el fin de recuperar el valor y unbox ella, hay que mencionar el tipo de contenedor específico:

// Explicit unboxing 
int x = (int) (Integer) map.get("int"); 
// Implicit unboxing 
int y = (Integer) map.get("int"); 
// USing a method from Number instead 
int z = ((Integer) map.get("int")).intValue(); 
+0

Vaya, Jon, realmente no duermes. Estaba a punto de publicar la misma cosa. :) –

+0

Otra opción para los números es Map

+2

@ Peter Lawrey, el OP quiere un valor también de tipo String. El número no califica. –

0

Puede use Integer en lugar de int.

3

Cuando coloca primitivas en Map en Java, obtienen Auto-Boxed en su formulario de objetos. Por ejemplo, si tiene un Map definido como:

Map<Integer, String> myMap = new HashMap<Integer, String>(); 

continuación, puede utilizar las primitivas de tipo int, ya que serán auto-encajonado en un Integer.

En cuanto a su pregunta original, que definen un Map como tal:

// using Integer for key type, can be something else 
Map<Integer, Object> myMap = new HashMap<Integer, Object>(); 

, entonces debería ser capaz de poner cualquier objeto Java en el mapa.

+1

Map ** es ** una interfaz, por lo que 'new Map ();' es un error. –

+0

@The Elite Gentleman - Disculpe, error –

Cuestiones relacionadas