Приведение итератора ключей 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>
}
...
}