条目集上的通用迭代器
static void myMethod(Map map) { Iterator<Entry> it = map.entrySet().iterator(); }
我在下面看到编译错误:
类型不匹配:无法从Iterator<Map.Entry>
为Iterator<Map.Entry>
尝试
Iterator extends Entry, V>> 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, V>
? extends Entry, V>
你不会暴露自己,因为你没有声称对Iterator
可以使用的Entry
类型有任何了解,只知道它可以产生什么。
编辑
虽然Jiman删除了他的答案,但他有一个很好的观点,即使用for-each循环是一种更清晰的方法(假设你只是试图迭代条目),这将完全避免这个问题。 这应该工作:
for ( Entry, V> entry : map.entrySet() ) { //... }