2012-02-15 10 views
1

私はJavaのジェネリックスに少し新しくなっています。私は次のような状況に遭遇し、コードが機能していない理由を理解できません。タイプList<capture#1-of ? extends Map<String,String>>マップのリストにエントリを追加するときのエラー

方法add(capture#1-of ? extends Map<String,String>)引数(Map<String,String>

+0

引用符で囲まれたエラーメッセージにコードスニペットをフォーマットしました。 '<' and '>'は、それらをバッククォート( ')の間に入れたり、テキストを4つのスペースで字下げしたりして、コードとして書式を設定しないかぎり、デフォルトでマークアップとして解釈されます。 –

+0

@PéterTörök - 私はそれを知りませんでした。ありがとう。 –

答えて

-1
List<? extends Map<String, String>> listEntries = new ArrayList<HashMap<String,String>>(); 

には適用されません:それは私に何かのように述べているコンパイル時のエラーを与える

List<? extends Map<String, String>> listEntries = new ArrayList<HashMap<String,String>>(); 
Map<String,String> entry = new HashMap<String,String>(); 
smsListEntry.put("1", "abc"); 
smsListEntry.put("2", "xyz"); 
listEntries.add(entry); 

あなたは次のように書いてください。

List<Map<String, String>> listEntries = new ArrayList<Map<String,String>>(); 

エントリのインターフェイスを使用してリストタイプを定義する必要があります。その後、

など、それを使用します。

Map<String,String> entry = new HashMap<String,String>(); 
entry.put("1", "abc"); 
entry.put("2", "xyz"); 
listEntries.add(entry); 
listEntries.add(new LinkedHashMap<String, String>()); // if you want you can use different implementations of Map 
+0

まずそれを試しました。 'codeType mismatch:ArrayList >からList >'に変換できません。 –

+0

'List >は、List >ではありません。 –

+0

「ハッシュ」を削除します。 –

2

はこれを試してみてください。

List<Map<String, String>> listEntries = new ArrayList<Map<String,String>>(); 
      Map<String,String> entry = new HashMap<String,String>(); 
      entry.put("1", "abc"); 
      entry.put("2", "xyz"); 
      listEntries.add(entry); 
      System.out.println(listEntries); 
+0

それは、ありがとう! –

3

想像あなたが

Map<String,String> entry = new TreeMap<String,String>(); 

Map<String,String> entry = new HashMap<String,String>(); 

を変更した場合今、あなたはあなたのArrayListHashMapのにTreeMapを追加しました。

ワイルドカードを削除し、実際に必要な汎用引数を使用します。

List<Map<String, String>> listEntries = new ArrayList<Map<String,String>>(); 

更新:元ジェネリックでArrayListへの参照を取ってこれをより明示的な、イメージを作るために。

List<HashMap<String,String>> orig = new ArrayList<HashMap<String,String>>(); 
List<? extends Map<String, String>> listEntries = orig; 
listEntries.add(new TreeMap<>()); // Shouldn't work! 
HashMap<String,String> treeMap = orig.get(0); // Oops! 
+0

さて、少し混乱してすみません。ごめんなさい。 extends Map > listEntries =新しいArrayList >() 'このステートメントは、mapを拡張するオブジェクトのリストが必要であることを意味します。これは、HashMapまたはTreeMapまたはMapだけになります。そうであれば、 'listEntries.add(entry);という行が表示されます。'はエントリがMap(HashMapとして実装されていますが)なので動作しなければなりません。私の理解がうんざりしているところを教えてください。 –

+0

@Poornima Prakashあなたが実際に作成したのは、 'HashMap'の' ArrayList'です。あなたはまだそのオブジェクトへの参照を持つことができます。 –

0

基本的には、List<? extends Map<...>は「私はMapを拡張し、いくつかのタイプを含むように制限リストを持っているが、私は正確な型を知らない」という意味。正確なタイプが実際にはTreeMapであるとします。HashMapをこのリストに入れることはできません。一般的にあなたには、いくつかのType<E>を持っていて、Type<? extends X> varを宣言した場合、あなたはコンパイラが?が(多分Xが、おそらく唯一のいくつかのことができますかを判断することはできませんので、パラメータとしてEを取るvar上の任意のメソッドを呼び出すことが許されることはありません、話す

サブタイプはX)。だからここにaddと電話をかけることはできません。

関連する問題