Java迭代器返回的结果的泛型类型不兼容

Java迭代器返回的结果的泛型类型不兼容,java,generics,iterator,incompatibility,Java,Generics,Iterator,Incompatibility,我有一个对象,它是一种映射类型,我试图用迭代器对它进行迭代。但是,我无法通过编译,代码如下 // Returned from other method, and the run time type is Map<String, B> Map<String, ? extends A> map = ... // Option 1: cannot pass. Iterator<Map.Entry<String, ? extends A>> iterat

我有一个对象,它是一种映射类型,我试图用迭代器对它进行迭代。但是,我无法通过编译,代码如下

// Returned from other method, and the run time type is Map<String, B>
Map<String, ? extends A> map = ...

// Option 1: cannot pass.
Iterator<Map.Entry<String, ? extends A>> iterator = map.entrySet().iterator();

// Option 2: cannot pass either.
// Where B is a subclass extends from A
Iterator<Map.Entry<String, B>> iterator = map.entrySet().iterator();
//从其他方法返回,运行时类型为Map
地图=。。。
//选项1:无法通过。
迭代器迭代器=map.entrySet().Iterator();
//选项2:两者都不能通过。
//其中B是从a扩展而来的子类
迭代器迭代器=map.entrySet().Iterator();

有人能帮我吗?谢谢。

我建议您使用foreach循环,而不是直接使用迭代器

Map<String, ? extends A> map = new HashMap<>();
for (Map.Entry<String, ? extends A> entry : map.entrySet()) {
    String key = entry.getKey();
    A value = entry.getValue();
}
Map Map=newhashmap();
对于(Map.Entry:Map.entrySet()){
String key=entry.getKey();
A值=entry.getValue();
}

我认为这应该可以解决问题

for (Map.Entry<String, ? extends A> entry : map.entrySet())
{
   String key = entry.getKey();
    A value = entry.getValue();
}
for(Map.Entry:Map.entrySet())
{
String key=entry.getKey();
A值=entry.getValue();
}

如果您真的想将
迭代器
存储在变量中,而不是存储在变量中

// ERROR
Iterator<Map.Entry<String, ? extends A>> iterator = map.entrySet().iterator();
原则上,每个条目都可以有一个不同的a子类型的值,因此每个
Map.entry
都是不同的类型。相比之下

Iterator<? extends Map.Entry<String, ? extends A>>
只允许从集合中获取条目,但

Set<Map.Entry<String, ? extends A>>
Set
将允许向集合中添加条目,这些条目可能包含集合的不同子类型,可能会污染集合

有关这方面的进一步讨论,请参阅

以及以下堆栈溢出问题:


为什么要显式使用迭代器?哇,它很管用。非常感谢。但是你能解释为什么我的代码不起作用吗?@ChazyT当你有
未知时,这并不意味着另一个
将等于它。我不知道为什么这对每个人都有效。通常,我避免使用
?扩展
,因为它通常会导致混淆。依我拙见
Iterator<? extends Map.Entry<String, ? extends A>>
Set<? extends Map.Entry<String, ? extends A>>
Set<Map.Entry<String, ? extends A>>