如何迭代通用Map

时间:2013-06-26 17:18:54

标签: java generics collections

我想为包含通用映射的泛型类创建一个clone()方法,但我仍然坚持迭代映射的入口集。这是重要的部分:

private Map<Object, ObjectWrapper<E>> map = new ConcurrentHashMap<Object, ObjectWrapper<E>>();
for (Map.Entry<Object, ObjectWrapper<E>> entry: map.entrySet()){
    ....
}

编译器错误是这样的:

[ERROR] found   : java.util.Map.Entry<java.lang.Object,abc.ObjectWrapper<E>>
[ERROR] required: java.util.Map.Entry<java.lang.Object,abc.ObjectWrapper<E>>

对我看起来一样:)

我可以通过遍历键并在循环内检索值来完成这些操作,但是我会遇到Sonar的麻烦。 我已经尝试将map.entrySet()的结果转换为很多东西(比如Set<? extends<Map.Entry<Object, ObjectWrapper<E>>>),如同类似主题所示,但没有结果:(

修改 问题是在类和方法中都使用了泛型参数。 为了将来参考,这是SSCE(不工作):

public class Test<E> {
private Map<Object, ObjectWrapper<E>> map = new ConcurrentHashMap<Object, ObjectWrapper<E>>();

public <E> Test<E> test(){
    for (Map.Entry<Object, ObjectWrapper<E>> entry: map.entrySet()){
    }
    return null;
}

private static class ObjectWrapper<T>{
}

}

1 个答案:

答案 0 :(得分:1)

从部分代码构建的以下代码适用于java版本1.6.0_24,没有任何错误

import java.lang.*;
import java.util.*;
import java.util.concurrent.*;

public class CMap<E>{
  public CMap() {

  }
  public void test() {
    Map<Object, List<E>> map = new ConcurrentHashMap<Object, List<E>>();
    for (Map.Entry<Object, List<E>> entry: map.entrySet()){

    }
  }

  public static void main(String[] args) {
    CMap<Integer> cMap = new CMap<Integer>();
    cMap.test();
  }
}

其编译和执行日志:

$ javac CMap.java
$ java CMap