この質問に続いて、解決策を提供しますが、説明していません(残念ながら、回答のリンクは現在死んでいます):
次の方法を取ります。
void method(Map<?, ?> myMap) {
Set<Map.Entry<?, ?>> set = myMap.entrySet();
...
}
簡単ですよね?ただし、これは jdk1.7.0_25 でのコンパイルに失敗します。
incompatible types required: java.util.Set<java.util.Map.Entry<?,?>> found: java.util.Set<java.util.Map.Entry<capture#1 of ?,capture#2 of ?>>
なんてこと?Map.entrySet()は type のオブジェクトを返すように指定されているSet<Map.Entry<K, V>>ため、上記の例では をmyMap.entrySet()返しますSet<Map.Entry<?, ?>>。しかし、それはコンパイルされません!
さらに奇妙なことに、上部のリンクされた質問から、メソッドをこれに変更するとコンパイルされます。
void method(Map<?, ?> myMap) {
Set<? extends Map.Entry<?, ?>> set = myMap.entrySet();
...
}
なんだ???aを呼び出すentrySetと aMap<?, ?>が返さSet<Map.Entry<K, V>>。これは、 type の変数には代入できませんがSet<Map.Entry<K, V>>、タイプSet<? extends Map.Entry<K, V>>?????
ここで何が起こっているのかを明らかにできる人はいますか? これは、少なくとも 2 レベルの深さのワイルドカード型を使用してメソッドを記述するときはいつでも、? extends ...どこかに作成することを覚えておく必要があるということですか?