代码之家  ›  专栏  ›  技术社区  ›  Menelaos

无法从Set<Map.Entry<String转换,捕获#2-of?将A>>扩展到Set<Map.Entry<String,?扩展A>>

  •  2
  • Menelaos  · 技术社区  · 10 年前

    我正在尝试执行以下操作以避免稍后未经检查的强制转换:

    代码:

    Set<Entry<String, ? extends SerializableForLayout>> set = 
    layoutObjectList.entrySet();
    

    错误:

    Type mismatch: cannot convert from Set<Map.Entry<String,capture#2-of ? 
    extends SerializableForLayout>> 
    to Set<Map.Entry<String,? extends SerializableForLayout>>
    

    完整代码:

    public void loadLayoutList(ArrayList<SerializableForLayout> preparedList,
                               ConcurrentHashMap<String, ? extends SerializableForLayout> layoutObjectList 
                                   )
        {       
            SerializableForLayout t;
            if (layoutObjectList == null)return;
    
            Set<?> set = layoutObjectList.entrySet();       
            Iterator<?> itTags = set.iterator();
            Entry<String, SerializableForLayout> entry;
    
            while (itTags.hasNext()) {
                entry = (Entry<String, SerializableForLayout>) itTags.next();
                t = entry.getValue();
                addForSerializableLayouts(t,preparedList);
            }
            Collections.sort(preparedList, ApplicationsSort.LayoutWeightComparator);
        }
    

    这是有效的:

    Set<?> set = layoutObjectList.entrySet();
    

    但有一个警告:

    强制取消选中行上的强制转换:

    entry = (Entry<String, SerializableForLayout>) itTags.next();
    

    我如何做到这一点而不需要压制?

    2 回复  |  直到 10 年前
        1
  •  4
  •   rgettman    10 年前

    问题是您正在使用多个 ? 在Java中,它们不能保证是相同的。将此方法设为泛型,这样您就可以引用泛型类型参数,并且在整个方法中都是相同的。

    public <T extends SerializableForLayout>
        void  loadLayoutList(ArrayList<SerializableForLayout> preparedList,
                             ConcurrentHashMap<String, T> layoutObjectList)
    

    然后,您应该能够正确定义 set 变量,使用 T .

    Set<Map.Entry<String, T>> set = layoutObjectList.entrySet();
    
        2
  •  1
  •   Ray Hulha    8 年前

    在我的情况下,我需要:

    public static <K, V> void printMap(Map<K, V> map) {
            Set<Entry<K, V>> entrySet = map.entrySet();
            for (Entry<K, V> entry : entrySet) {
                System.out.println(entry.getKey() + " " + entry.getValue());
            }
        }
    }