2012-02-28 2 views
98

Guava offre una bella scorciatoia per inizializzare una mappa. Tuttavia ottengo il seguente errore del compilatore (Eclipse Indigo) quando la mia mappa viene inizializzata su nove voci.inizializzazione di Guava ImmutableMap

Procedimento of(K, V, K, V, K, V, K, V, K, V) nel tipo ImmutableMap non è applicabile per le argomentazioni (String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String)

ImmutableMap<String,String> myMap = ImmutableMap.of(
     "key1", "value1", 
     "key2", "value2", 
     "key3", "value3", 
     "key4", "value4", 
     "key5", "value5", 
     "key6", "value6", 
     "key7", "value7", 
     "key8", "value8", 
     "key9", "value9" 
     ); 

sembra dire che

Un ImmutableMap ha una dimensione massima di quattro coppie di chiave Il messaggio, valore.

Ovviamente, questo non può essere il caso ma non riesco a capire cosa fare per aumentare la dimensione del mio inizializzatore.

Qualcuno può dirmi cosa manca?

risposta

183

Si noti che il messaggio di errore contiene solo cinque coppie K, V, 10 argomenti in totale. Questo è di design; la classe ImmutableMap fornisce sei diversi metodi of(), accettando tra zero e sei coppie di valori-chiave. Non esiste un sovraccarico of(...) che accetta un parametro varags perché K e V possono essere diversi tipi.

You want an ImmutableMap.Builder:

ImmutableMap<String,String> myMap = ImmutableMap.<String, String>builder() 
    .put("key1", "value1") 
    .put("key2", "value2") 
    .put("key3", "value3") 
    .put("key4", "value4") 
    .put("key5", "value5") 
    .put("key6", "value6") 
    .put("key7", "value7") 
    .put("key8", "value8") 
    .put("key9", "value9") 
    .build(); 
+2

penso che dovrebbe essere ' PUT'. Di solito è necessario specificare anche i parametri di tipo, ad es .: 'ImmutableMap. builder()' se ricordo male. –

+0

@PaulBellora: Effettivamente dovrebbe - stava solo aggiustando :) –

+0

Grazie per le risposte rapide. Ho deciso di provare Guava perché non volevo digitare tutte le "put" richieste da un inizializzatore di mappe standard. Così tanto per quell'idea! – user903724

53

se la mappa è breve si può fare:

ImmutableMap.of(key, value, key2, value2); // ...up to five k-v pairs 

Se è più lungo, allora:

ImmutableMap.builder() 
    .put(key, value) 
    .put(key2, value2) 
    // ... 
    .build(); 
+8

Oltre alla leggibilità, è possibile utilizzare il factory statico 'ImmutableMap.of' per un massimo di cinque coppie di valori chiave. Quindi devi usare il costruttore. – Xaerxess

+1

+1 per risposta breve – zencv