The error you get in your first one is:
Type mismatch: cannot convert from element type Object to Map.Entry
This is because the compiler converts your FOR-IN loop:
for (Entry entry : anyMap.entrySet()) {
}
To:
for (Iterator i = anyMap.entrySet().iterator(); i.hasNext();) {
Entry e = i.next(); // not allowed
}
Your second example works, but only through cheating! You are doing an unchecked cast to get Set
back into a Set<Entry>
.
Set<Entry> entries = anyMap.entrySet(); // you get a compiler warning here
for (Entry entry : entries) {
}
Becomes:
Set<Entry> entries = anyMap.entrySet();
for (Iterator<Entry> i = entries.iterator(); i.hasNext(); ) {
Entry e = (Entry) i.next(); // allowed
}
Update
As mentioned in comments, the type information is getting lost in both examples: because of the compiler's raw type erasure rules.
To provide backwards compatibility, ALL methods of raw type instances are replaced by their erased counterparts. So, because your Map
is a raw type, it all gets erased. Including its Set<Map.Entry<K, V>> entrySet();
method: your raw type instance will be forced to use the erased version: Set entrySet()
.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…