条目集上的通用迭代器

static  void myMethod(Map map) { Iterator<Entry> it = map.entrySet().iterator(); } 

我在下面看到编译错误:
类型不匹配:无法从Iterator<Map.Entry>Iterator<Map.Entry>

尝试

 Iterator> it = map.entrySet().iterator(); 

你的尝试不起作用的原因有点难以理解,特别是因为Iterator不消耗任何T (即它没有一个以T作为参数的方法)。

您无法将Iterator>分配给Iterator> ,原因与您无法分配Iterator>Iterator>capture#5只是用于区分特定的名称? 在其他不同的通配符实例的方法参数中找到。 它可以很容易地成为具体类型。

如果不是Iterator你会想到像List这样的类,那么这个不起作用的原因就更清楚了。

 List> entries = new ArrayList<>(); //this is a compile error, but assume it is possible List> wildcardEntries = entries; //then since this is already possible wilcardEntries.add(new Entry("a", "b")); Entry entry1 = entries.get(0); //this would result in a type error (ClassCastException) Integer i = entry1.getKey(); 

通过使用? extends Entry ? extends Entry你不会暴露自己,因为你没有声称对Iterator可以使用的Entry类型有任何了解,只知道它可以产生什么。

编辑

虽然Jiman删除了他的答案,但他有一个很好的观点,即使用for-each循环是一种更清晰的方法(假设你只是试图迭代条目),这将完全避免这个问题。 这应该工作:

 for ( Entry entry : map.entrySet() ) { //... }