Инициализация неизменяемой карты Guava

Guava предлагает удобный ярлык для инициализации карты. Однако я получаю следующую ошибку компилятора (Eclipse Indigo), когда моя карта инициализируется до девяти записей.

Метод of(K, V, K, V, K, V, K, V, K, V) в типе ImmutableMap не применим для аргументов (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"
        );

Появится сообщение, что

У ImmutableMap максимальный размер четырех пар ключа, значение.

Очевидно, этого не может быть, но я не могу понять, что делать, чтобы увеличить размер моего инициализатора.

Может кто-нибудь сказать мне, что не хватает?

Ответ 1

Обратите внимание, что ваше сообщение об ошибке содержит только пять пар K, V, всего 10 аргументов. Это по замыслу; класс ImmutableMap предоставляет шесть различных of(), принимающих от нуля до пяти пар ключ-значение. Не существует перегрузки of(...) принимающей параметр varags, потому что K и V могут быть разных типов.

Вы хотите 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

если короткое отображение можно сделать:

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

Если он длиннее, то:

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

Ответ 3

"put" устарел, воздержитесь от его использования, используйте вместо него .of

ImmutableMap<String, String> myMap = ImmutableMap.of(
    "city1", "Seattle",
    "city2", "Delhi"
);