【问题标题】:Compiler complains when I iterate Non-Generics Map in Java当我在 Java 中迭代非泛型映射时,编译器会抱怨
【发布时间】:2010-10-11 07:44:33
【问题描述】:

我在 Java 中迭代非泛型映射时遇到了奇怪的问题

Map map=new HashMap();
for (Map.Entry entry:map.entrySet()){

}

但是编译器抱怨说“类型不匹配:无法从元素类型 Object 转换为 Map.Entry” 当我将地图类型更改为泛型时,它可以工作

Map<Object,Object> map=new HashMap<Object,Object>();
for (Map.Entry entry:map.entrySet()){

}

这让我很困惑,有人知道是什么原因吗?提前致谢。

【问题讨论】:

    标签: java generics


    【解决方案1】:

    当您使用原始类型时,就像您在此处使用 Map 所做的那样,所有泛型都被关闭,因此 entrySet() 只返回一个裸露的 Set 类型(不是 Set&lt;Map.Entry whatever&gt;),如果您迭代它,你只能从中得到Objects。

    【讨论】:

      【解决方案2】:

      在 JDK1.5 之前,map.entrySet() 返回一个 Set(属于 Map.Entry,但你无法直接分辨)。

      设置条目 = map.entrySet(); Map.Entry entry = (Map.Entry) entries.iterator().next(); //

      【讨论】:

        【解决方案3】:

        为什么这不起作用?

        这取决于你的编译器。

        在 Mac 上使用 javac 1.6.0_20,我没有任何问题。

        也许正如@newacct 所建议的那样,泛型已针对您的扩展 for 语句关闭。但由于它取决于您的编译器(而不是 JLS),因此很难确切地知道原因。

        如何更改才能工作?

        Map.Entry 是一个泛型类,因此如果您选择在应用程序中使用泛型,则应该在任何地方使用它们。

        Map<Object,Object> map=new HashMap<Object,Object>();
        for (Map.Entry<Object, Object> entry:map.entrySet()){
        
        }
        

        【讨论】:

        • @aioobe,更新了,事实上它可以在一些编译器(这里是 javac)上编译,甚至没有警告。
        猜你喜欢
        • 2012-07-09
        • 1970-01-01
        • 2016-04-22
        • 2014-05-16
        • 1970-01-01
        • 2011-01-08
        • 1970-01-01
        • 1970-01-01
        • 2012-09-12
        相关资源
        最近更新 更多