2010-12-13 12 views
6

Ho bisogno di una mappa in cui i valori siano di tipi diversi, come intero, stringa ecc. Il problema con Java è che le primitive qui non sono Object s che suggerisce che potrebbe non essere possibile avere un dizionario ibrido. Voglio confermarloEsiste un dizionario che accetta valori di vari tipi di dati?

+0

vedere anche http://stackoverflow.com/questions/2001755/using-int-as-a-type-parameter-for-java-util-dictionary – Fortega

+1

È possibile condividere altri progetti per i commenti. Nella mia esperienza, l'utilizzo di diversi tipi di valori in una mappa spesso è indice di una progettazione non ottimale. –

+0

Voglio un desrializer JSON che possa creare un albero, basandosi solo sul messaggio invece di convertirlo in una determinata classe di destinazione. Quindi voglio un dizionario (dizionario o mappa qualunque sia il nome) o un elenco come output come dice Jon Skeet assumendo il pugilato automatico in Java. Supponendo anche che ci sia una bella libreria di serializzazione-deserialzazione JSON che fa questo. Per esempio, Gson ha bisogno di un tipo in cui il messaggio verrà deserializzato. Quindi Gson non è utile per me. Spero tu capisca il mio problema. – ada

risposta

1

È possibile sfruttare l'autoboxing e utilizzare Integer anziché int e così via.

I corrispondenti tipi (Integer, Double, Bool, ...) erediterà oggetto, così si potrebbe utilizzare uno standard Map<Object, Whatever> e buttare roba arbitraria a questo.

8

Sembra che tu voglia solo un Map<String, Object> (o qualunque sia il tuo tipo di chiave).

valori primitivi sono imballati in modo appropriato:

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

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

Si noti che, al fine di recuperare il valore e Unbox esso, è necessario menzionare il tipo di involucro specifica:

// 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

Geez Jon, davvero non dormi. Stavo per pubblicare la stessa cosa. :) –

+0

Un'altra opzione per i numeri è Map

+2

@Peter Lawrey, l'OP vuole un valore anche di tipo String. Il numero non si qualifica. –

0

Puoi utilizzare Integer anziché int.

3

Quando si inseriscono le primitive in un Map in Java, ottengono Auto-Boxed nella loro forma di oggetto. Ad esempio, se avete un Map definito come:

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

quindi è possibile utilizzare le primitive di tipo int, in quanto saranno automaticamente inscatolato in un Integer.

Per quanto riguarda la tua domanda iniziale, la definizione di un Map come tale:

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

allora si dovrebbe essere in grado di mettere qualsiasi oggetto Java nella mappa.

+1

Map ** è ** un'interfaccia, quindi 'nuova Map ();' è un errore. –

+0

@The Elite Gentleman - Ci dispiace, errore di battitura –

Problemi correlati