Вопрос не по методу clear. Не понятен для меня переопределённый метод. Как он создаёт и возвращает итератор?
@Override
public Iterator<E> iterator() { //почему здесь не отображается дженерик - ведь в коде он есть?
   return map.keySet().iterator();
}
В этом переопределённом методе iterator() класса AmigoSet вызывается абстрактный метод iterator() интерфейса Set. И по логике вещей здесь будет использоваться реализация метода iterator() в классе AmigoSet. Замкнутый круг? Два класса ссылаются на те же методы друг друга. В результате где всё-таки создаётся итератор?