При повторении Map<> с использованием цикла for
for(Map.Entry<K,V> mapEntry : myMap.entrySet()){
// something
}
Я обнаружил, что метод entrySet() возвращает набор Entry<K,V>
так что у него есть метод add(Entry<K,V> e)
затем я создал класс, реализующий Map.Entry<K,V>, и попытался вставить объект, как показано ниже
public final class MyEntry<K, V> implements Map.Entry<K, V> {
private final K key;
private V value;
public MyEntry(K key, V value) {
this.key = key;
this.value = value;
}
@Override
public K getKey() {
return key;
}
@Override
public V getValue() {
return value;
}
@Override
public V setValue(V value) {
V old = this.value;
this.value = value;
return old;
}
}
Entry<String, String> entry = new MyEntry<String, String>("Hello", "hello");
myMap.entrySet().add(entry); //line 32
нет ошибки компиляции, но это вызывает ошибку времени выполнения
Exception in thread "main"
java.lang.UnsupportedOperationException
at java.util.AbstractCollection.add(AbstractCollection.java:262)
at com.seeth.AboutEntrySetThings.main(AboutEntrySetThings.java:32)
@OHGODSPIDERS Я использовал HashMap здесь




Из метода JavaDoc на entrySet():
The set supports element removal, which removes the corresponding mapping from the map, via the Iterator.remove, Set.remove, removeAll, retainAll and clear operations. It does not support the add or addAll operations.
Документация для этого метода https://docs.oracle.com/javase/10/docs/api/java/util/AbstractCollection.html#add(E) говорит
This implementation always throws an UnsupportedOperationException.
Затем подклассы переопределяют его и public void add(int size, E element);
Подкласс EntrySet в HashMap не отменяет его.
Проблема в том, что вы вызываете метод add() на entrySet() из HashMap и в этом классе нет такой реализации, только в его суперклассах.
Из исходного кода HashMap:
public Set<Map.Entry<K,V>> entrySet() {
Set<Map.Entry<K,V>> es;
return (es = entrySet) == null ? (entrySet = new EntrySet()) : es;
}
final class EntrySet extends AbstractSet<Map.Entry<K,V>> {
// there is no add() override
}
Поскольку метод add() не переопределяется (ни в HashMap.EntrySet, ни в AbstractSet), будет использоваться метод из AbstractCollection, который имеет следующее определение:
public boolean add(E e) {
throw new UnsupportedOperationException();
}
Также, глядя на entrySet() Javadoc:
(...) The set supports element removal, which removes the corresponding mapping from the map, via the Iterator.remove, Set.remove, removeAll, retainAll and clear operations. It does not support the add or addAll operations.
Метод java.util.HashMap.entrySet () возвращает класс java.util.HashMap.EntrySet, который сам по себе не реализует метод Set.add ().
Чтобы добавить объект в коллекцию, необходимо использовать метод myMap.put (entry.getKey (), entry.getValue ()).
Метод entrySet () используется только для чтения данных, а не для модификации.
Какой тип у myMap?