2012-02-28 2 views
98

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

方法of(K, V, K, V, K, V, K, V, K, V)は、メッセージが

アンImmutableMapは、キーの4ペアの最大サイズを持っていると言うように見える引数 (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" 
     ); 

には適用されません値。

明らかに、これは当てはまりませんが、私のイニシャライザのサイズを増やすために何をすべきか分かりません。

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

答えて

183

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

あなたは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

私はそれは 'すべきだと思います「put」。また、タイプパラメータは通常、指定する必要があります。正しく記憶されている場合は、 'ImmutableMap。 builder()'です。 –

+0

@PaulBellora:確かにそれはちょうど固定していたはずです:) –

+0

クイック回答ありがとう。グアバを試してみることにしたのは、標準のマップイニシャライザが必要とするすべての「puts」をタイプする必要がないからです。それほど多くのアイデアを! – user903724

53

マップは、あなたが行うことができます短い場合:

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

それは、その後長い場合:

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

可読性とは別に、静的ファクトリの 'ImmutableMap.of'を最大5つのキー値ペアに対して使用することができます。次に、ビルダーを使用する必要があります。 – Xaerxess

+1

+1短い回答 – zencv