令人困惑的类型关系

时间:2014-09-16 20:38:53

标签: java

我最近在这个网站上看到了以下内容:

for (HashMap.Entry<Object,Object> e : new TreeMap<>().entrySet()) 
  System.out.println(e);

令我惊讶的是,这编译并运行良好。我也尝试在地图中添加条目,因此实际上有一些内容可以向下转换,但是这样做也失败了,这也很好。如何将TreeMap条目转换为HashMap.Entry?这两个甚至不在层次结构的同一分支上。

更新

虽然现在已经解决了这个问题,但我还是将以下内容仅仅包含在内,以下没有编译:

for (TreeMap.Entry<Object,Object> e : new HashMap<>().entrySet())
  System.out.println(e);

TreeMap定义TreeMap.Entry,隐藏了Map.Entry

2 个答案:

答案 0 :(得分:9)

虽然您是在HashMap上访问它,但Entry实际上是static中声明的(隐式Map)成员类型。 TreeMap#entrySet的返回类型为Set<Map.Entry<K,V>>。这是Entry类型。

答案 1 :(得分:1)

new TreeMap<>().entrySet() returns Set<Map.Entry<K,V>>并且您正在迭代集(Entry<Object, Object>)的每个条目。因此它编译。在java 8中,您可以替换for循环,如

new TreeMap<>().entrySet().forEach(System.out::println);