この質問に続いて、解決策を提供しますが、説明していません(残念ながら、回答のリンクは現在死んでいます):
次の方法を取ります。
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 ...
どこかに作成することを覚えておく必要があるということですか?