迭代地图输入集

我需要遍历地图的入口集,我不知道它的参数化类型。

迭代这样的入口集时,为什么不编译?

public void myMethod(Map anyMap) { for(Entry entry : anyMap.entrySet()) { ... } } 

但这个编译:

 public void myMethod(Map anyMap) { Set entries = anyMap.entrySet(); for(Entry entry : entries) { ... } } 

这也编译(我不能使用这个,因为我不知道地图的类型):

 public void myMethod(Map stringMap) { for(Entry entry : stringMap.entrySet()) { ... } } 

你在第一个错误中得到的错误是:

 Type mismatch: cannot convert from element type Object to Map.Entry 

这是因为编译器会转换FOR-IN循环:

 for (Entry entry : anyMap.entrySet()) { } 

至:

 for (Iterator i = anyMap.entrySet().iterator(); i.hasNext();) { Entry e = i.next(); // not allowed } 

你的第二个例子有效, 但只能通过作弊! 您正在进行未经检查的强制转换以Set Set Set

 Set entries = anyMap.entrySet(); // you get a compiler warning here for (Entry entry : entries) { } 

变为:

 Set entries = anyMap.entrySet(); for (Iterator i = entries.iterator(); i.hasNext(); ) { Entry e = (Entry) i.next(); // allowed } 

更新

正如评论中所提到的,两个示例中的类型信息都会丢失:因为编译器的原始类型擦除规则。

为了提供向后兼容性,原始类型实例的所有方法都被其已擦除的对应项替换。 因此,因为您的Map是原始类型,所以它都会被删除。 包括它的Set> entrySet(); 方法:您的原始类型实例将被强制使用已擦除的版本: Set entrySet()

这是因为你使用原始类型Map,因此map.entrySet()会获得一个非参数化的Set,它反过来在迭代时产生Object,而不是Entry。

一个简单但优雅的解决方案是使用Map <?,?>,它仍然允许您传递任何Map,但另一方面强制map.entrySet()具有Set 的返回值:

 public void test(Map map) { for(Entry e : map.entrySet()){ Object key = e.getKey(); Object value = e.getValue(); } } 

在第一个示例中,map.entrySet()返回Set,当您循环迭代时,使用Iterator。 没有关于集内容类型的信息,因此Java使用Object as Object是基类型,编译器告诉您它不能将Object转换为Entry。

 Set> entrySet(); 

当您使用原始地图类型时,entrySet仅返回Set,没有类型信息。

在第二个示例中,您手动将Set转换为Set (带警告)。 现在Java知道它里面的内容。 所以你可以迭代。

在上一个示例中,您知道映射类型,因此entrySet返回正确的类型集,您可以在没有任何类型约定的情况下进行迭代。

第一个代码片段不会编译,因为变量map不存在。 你调用参数anyMap但尝试将其作为map访问,修复它并且你的代码将从一些rawtypes警告中编译

您正在获取编译时间rrror,因为您没有在HashMap指定类型

喜欢

 HashMap <(Integer,String> hm=new HashMap<(Integer,String>(); 

如果将类型指定为Integer和String,则不会出现编译时错误。

如果您不知道哪个值将添加到您的HashMap中,那么您使用

 HashMap<(Object,Object> hm=new HashMap(); 

我遇到了同样的问题。 似乎铸造是一个问题。 我尝试了下面的代码,它工作。

  for(Object entry : hashMap.entrySet()) { System.out.println(((Entry) entry).getKey() + " = " + ((Entry) entry).getValue()); } 
Interesting Posts