【问题标题】:Casting HashMap Key Iterator to AbstractIterator将 HashMap 键迭代器转换为 AbstractIterator
【发布时间】:2014-07-21 10:49:42
【问题描述】:

我有以下代码:

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

AbstractIterator 是 guava 类,它提供了 {@code Iterator} 接口的骨架实现。所以它扩展了UnmodifiableIterator&lt;E&gt;,它实现了Iterator&lt;E&gt;

但是当我尝试投射这样的东西时:

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

我的代码有什么问题?

感谢您的帮助!

【问题讨论】:

    标签: java collections guava classcastexception


    【解决方案1】:

    HashSet的迭代器实际上是这样的:

    HashMap$KeyIterator
    

    延伸

    HashMap$HashIterator
    

    实现了

    Iterator
    

    如您所见,guava AbstractIterator 显然不在该继承链中。因此你不能投射到它。

    【讨论】:

      【解决方案2】:

      HashSet 有自己的迭代器。试试这个:

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

      来自哈希集:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-14
        • 1970-01-01
        • 2011-09-02
        • 2011-03-21
        • 2010-12-02
        • 2020-05-18
        • 2021-08-26
        • 2010-10-19
        相关资源
        最近更新 更多