2014-07-21 53 views
2

我有以下代碼:鑄造HashMap的關鍵迭代AbstractIterator

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

AbstractIterator它的番石榴類,它提供的骨幹實現{@code迭代器}接口。因此,它擴展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 

什麼是我的代碼的問題?

感謝您的肝臟!

回答

4

HashSet的迭代器實際上是類型:

HashMap$KeyIterator 

延伸

HashMap$HashIterator 

它實現

Iterator 

正如你所看到的,番石榴AbstractIterator顯然不是在繼承鏈。因此你不能施展它。

0

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> 
    } 
    ... 
}