私はJavaのジェネリックスに少し新しくなっています。私は次のような状況に遭遇し、コードが機能していない理由を理解できません。タイプList<capture#1-of ? extends Map<String,String>>
でマップのリストにエントリを追加するときのエラー
方法
add(capture#1-of ? extends Map<String,String>)
引数(Map<String,String>
)
私はJavaのジェネリックスに少し新しくなっています。私は次のような状況に遭遇し、コードが機能していない理由を理解できません。タイプList<capture#1-of ? extends Map<String,String>>
でマップのリストにエントリを追加するときのエラー
方法
add(capture#1-of ? extends Map<String,String>)
引数(Map<String,String>
)
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
まずそれを試しました。 'codeType mismatch:ArrayList
'List
「ハッシュ」を削除します。 –
はこれを試してみてください。
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);
それは、ありがとう! –
想像あなたが
Map<String,String> entry = new TreeMap<String,String>();
に
Map<String,String> entry = new HashMap<String,String>();
を変更した場合今、あなたはあなたのArrayList
HashMap
のに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!
さて、少し混乱してすみません。ごめんなさい。 extends Map
@Poornima Prakashあなたが実際に作成したのは、 'HashMap'の' ArrayList'です。あなたはまだそのオブジェクトへの参照を持つことができます。 –
基本的には、List<? extends Map<...>
は「私はMap
を拡張し、いくつかのタイプを含むように制限リストを持っているが、私は正確な型を知らない」という意味。正確なタイプが実際にはTreeMap
であるとします。HashMap
をこのリストに入れることはできません。一般的にあなたには、いくつかのType<E>
を持っていて、Type<? extends X> var
を宣言した場合、あなたはコンパイラが?
が(多分X
が、おそらく唯一のいくつかのことができますかを判断することはできませんので、パラメータとしてE
を取るvar
上の任意のメソッドを呼び出すことが許されることはありません、話す
サブタイプはX
)。だからここにadd
と電話をかけることはできません。
引用符で囲まれたエラーメッセージにコードスニペットをフォーマットしました。 '<' and '>'は、それらをバッククォート( ')の間に入れたり、テキストを4つのスペースで字下げしたりして、コードとして書式を設定しないかぎり、デフォルトでマークアップとして解釈されます。 –
@PéterTörök - 私はそれを知りませんでした。ありがとう。 –