2012-02-28 10 views
98

Guava ofrece un buen atajo para inicializar un mapa. Sin embargo, recibo el siguiente error de compilación (Eclipse Indigo) cuando mi mapa se inicializa en nueve entradas.inicializando una ImmutableMap de Guava

El método of(K, V, K, V, K, V, K, V, K, V) en el tipo ImmutableMap no es aplicable para los argumentos (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" 
     ); 

El mensaje aparece decir que

Un ImmutableMap tiene un tamaño máximo de cuatro pares de clave, valor.

Obviamente, este no puede ser el caso, pero no sé qué hacer para aumentar el tamaño de mi inicializador.

¿Alguien me puede decir lo que falta?

Respuesta

183

Observe que su mensaje de error solo contiene cinco pares K, V, 10 argumentos en total. Esto es por diseño; la clase ImmutableMap proporciona seis métodos diferentes de of(), aceptando entre cero y seis pares clave-valor. No hay una sobrecarga de of(...) que acepte un parámetro de varags porque K y V pueden ser de tipos diferentes.

¿Quieres una 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

creo que debería ser ' poner'. Además, los parámetros de tipo generalmente deben especificarse, es decir: 'ImmutableMap. builder()' si no recuerdo mal. –

+0

@PaulBellora: De hecho debería - solo estaba arreglando :) –

+0

Gracias por las respuestas rápidas. Decidí probar Guava porque no quería tener que escribir todas las 'puts' requeridas por un inicializador de mapas estándar. ¡Demasiado para esa idea! – user903724

53

si el mapa es corto que puede hacer:

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

Si es más largo, entonces:

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

Además de la legibilidad, puede usar la fábrica estática 'ImmutableMap.of' para un máximo de cinco pares de valores clave. Entonces tienes que usar el constructor. – Xaerxess

+1

+1 por respuesta corta – zencv