Приведение итератора ключей HashMap к AbstractIterator

У меня есть следующий код:

class SomeIterator<T> extends AbstractIterator<T> { ... }

AbstractIterator это класс guava, который обеспечивает скелетную реализацию интерфейса {@code Iterator}. Так расширяется UnmodifiableIterator<E> который реализует Iterator<E>

Но когда я пытаюсь разыграть что-то вроде этого:

Set<Object> hashSet = new HashSet<Object>();
SomeIterator iterator = (SomeIterator) hashSet.iterator();

Я получил исключение:

ClassCastException: java.util.HashMap$KeyIterator cannot be cast to com.google.common.collect.AbstractIterator

В чем проблема с моим кодом?

Спасибо за твою помощь!

2 ответа

Решение

HashSetИтератор на самом деле имеет тип:

HashMap$KeyIterator

который расширяется

HashMap$HashIterator

который реализует

Iterator

Как видите, гуава AbstractIterator явно не в этой цепочке наследования. Таким образом, вы не можете использовать его.

HashSet имеет свой собственный итератор. попробуй это:

Set<Object> hashSet = new HashSet<Object>();
Iterator<Obejct> iterator = hashSet.iterator();

Из HashSet:

HashSet(int initialCapacity, float loadFactor, boolean dummy) {
    map = new LinkedHashMap<>(initialCapacity, loadFactor);
}

public Iterator<E> iterator() {
    return map.keySet().iterator();
}
...

Из LinkedHashMap:

public Set<K> keySet() {
    Set<K> ks = keySet;
    return (ks != null ? ks : (keySet = new KeySet()));
}

private final class KeySet extends AbstractSet<K> {
    public Iterator<K> iterator() {
        return newKeyIterator(); //^ -> KeyIterator extends HashIterator<K>
    }
    ...
}
Другие вопросы по тегам