why iterating a received generic HashMap can only be done with enhanced for-loop?

Rotem Linik :

I am implementing a putAll() method. I tried to iterate the map using entrySet and iterator methods, but received a compiling error that m.entrySet().iterator() return value could not be converted to Iterator<Entry<? extends K, ? extends V>>. why? if the map is of that type, it's iterator should be as well, no?

thank you! doesn't compile:

@Override
public void putAll(Map<? extends K, ? extends V> m) {       
        Iterator<Entry<? extends K, ? extends V>> iter = m.entrySet().iterator();

    while (iter.hasNext()) {
        Entry<? extends K, ? extends V> entry = iter.next();
        put(entry.getKey(), entry.getValue());
    }
}

compiles and works fine:

@Override
public void putAll(Map<? extends K, ? extends V> m) {
    Objects.requireNonNull(m, "putAll(): argument is null");

    for (Entry<? extends K, ? extends V> entry : m.entrySet()) {
        put(entry.getKey(), entry.getValue());
    }
}
Lino :

Change

Iterator<Entry<? extends K, ? extends V>> iter

To

Iterator<? extends Entry<? extends K, ? extends V>> iter

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=78082&siteId=1