【问题标题】:How can I override HashMap's putAll to call put on each <K,V> pair?如何覆盖 HashMap 的 putAll 以在每个 <K,V> 对上调用 put?
【发布时间】:2014-07-10 12:31:46
【问题描述】:

我正在尝试覆盖 PutAll 以循环遍历这些对并在它们上调用 put,因为我使用的是自定义 HashMap 对象。我试过这个:

        @Override
        public void putAll(final Map m) {
            Iterator iterator = m.entrySet().iterator();
            while (iterator.hasNext()) {
                Map.Entry pairs = (Map.Entry)iterator.next();
                put(pairs.getKey(), pairs.getValue());
            }
        }

但它给了我以下错误:

Compiling the source code....
$javac HelloWorld.java 2>&1
HelloWorld.java:109: error: no suitable method found for put(Object,Object)
                put(pairs.getKey(), pairs.getValue());
                ^
    method UniqueHashMap.put(K,V) is not applicable
      (actual argument Object cannot be converted to K by method invocation conversion)
    method HashMap.put(K,V) is not applicable
      (actual argument Object cannot be converted to K by method invocation conversion)
    method AbstractMap.put(K,V) is not applicable
      (actual argument Object cannot be converted to K by method invocation conversion)
  where K,V are type-variables:
    K extends Object declared in class UniqueHashMap
    V extends Object declared in class UniqueHashMap
1 error

【问题讨论】:

    标签: java hashmap overriding key-value


    【解决方案1】:

    不要用Raw Types,你好像有泛型K,V这样用,

    @Override
    public void putAll(Map<? extends K, ? extends V> m) {
      Iterator<? extends K> iterator = m.keySet().iterator();
      while (iterator.hasNext()) {
        K key = iterator.next();
        put(key, m.get(key));
      }
    }
    

    【讨论】:

    • 不使用有界类型参数会阻止你调用,例如HashMap&lt;String,Base&gt;.putAll(HashMap&lt;String,Derived&gt;)
    【解决方案2】:

    我猜你的自定义地图类有类型参数,所以你正确的覆盖应该是:

    @Override
    void putAll(Map<? extends K,? extends V> m) {
      Iterator<Map.Entry<? extends K,? extends V>> iterator = m.entrySet().iterator();
      while (iterator.hasNext()) {
        Map.Entry<? extends K,? extends V> pairs = iterator.next();
        put(pairs.getKey(), pairs.getValue());
      }
    }
    

    其中KV 是用于您的类的类型变量。

    【讨论】:

    • HelloWorld.java:105: 错误:UniqueHashMap 中的 putAll(Map extends K#1,? extends V#1>) 无法实现 putAll(Map extends K#2,? extends V #2>) in Map void putAll(Map extends K,? extends V> m) { ^ 试图分配较弱的访问权限;是公共的,其中 K#1、V#1、K#2、V#2 是类型变量: K#1 扩展了 UniqueHashMap 类中声明的对象 V#1 扩展了 UniqueHashMap 类中声明的对象 K#2 扩展了接口 Map 中声明的对象V#2 扩展了接口 Map 中声明的 Object
    • HelloWorld.java:106:错误:不兼容的类型迭代器> 迭代器 = m.entrySet().iterator(); ^ 必需:迭代器> 找到: Iterator> 其中 K,V 是类型变量: K 扩展类 UniqueHashMap 中声明的对象 V 扩展类 UniqueHashMap 中声明的对象,其中 CAP#1,CAP#2是新鲜的类型变量:CAP#1 从捕获的 ? 扩展 K扩展 K CAP#2 从捕获的 ? 中扩展 V扩展V
    • @Alexandru 因为你的UniqueHashMap 有更多的原始类型。发布您的其余代码。
    • 我尝试将其公开,然后使用 Iterator>,但后来我得到了这个:HelloWorld.java:106:错误:条目在 HashMap 中不公开;无法从外部包 Iterator> 迭代器 = m.entrySet().iterator(); ^ 1 个错误
    猜你喜欢
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多