web-dev-qa-db-ja.com

Guava ImmutableMapの初期化

Guavaは、マップを初期化するための素敵なショートカットを提供します。ただし、マップが9つのエントリに初期化されると、次のコンパイラエラー(Eclipse Indigo)が発生します。

タイプImmutableMapのメソッドof(K, V, K, V, K, V, K, V, K, V)は、引数(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の最大サイズは、キー、値の4ペアです。

明らかにこれは事実ではありませんが、イニシャライザのサイズを増やすために何をすべきかわかりません。

誰かが不足しているものを教えてもらえますか?

127
user903724

エラーメッセージには5つのK, Vペアのみが含まれ、合計10個の引数があることに注意してください。これは仕様によるものです。 ImmutableMapクラスは6つの異なるof()メソッドを提供し、0〜5つのキーと値のペアを受け入れます。 KVは異なる型になる可能性があるため、varagsパラメーターを受け入れるof(...)オーバーロードはありません。

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();
234
Jon Skeet

マップが短い場合、次のことができます。

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

それよりも長い場合:

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

「put」は 非推奨 になりました。使用を控え、代わりに.ofを使用してください

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