访问Map#entrySet()时出现“不兼容的类型”

时间:2013-11-21 14:08:46

标签: java intellij-idea

我正在开发一个简单的配置文件阅读器,但我在编写测试方法时遇到了一个奇怪的错误。它是一个for循环,我已经确定它会导致问题。它给了我这个编译错误:

Incompatible types:
    Required: java.util.Map.Entry
    Found: java.lang.Object

地图声明是这样的:

Map<String, String> props = new HashMap<String, String>();

for循环编写如下:

for (Map.Entry<String, String> entry : props.entrySet()) {
    //Body
}

没有导入的SSCCE证明了这个问题(至少在IntelliJ中):

public class A {
    public static void main(String[] args) {
        Map<String, String> props = new HashMap<String, String>();
        for (int i = 0; i < 100; i++) {
            props.put(new BigInteger(130, random).toString(32), new BigInteger(130, random).toString(32));
        }
        for (Map.Entry<String, String> entry : props.entrySet()) {
            System.out.println(entry.getKey() + ":" + entry.getValue());
        }
    }
}

mapMap<String, String>,所以这不是问题所在。我用Google搜索了另外一种方法,但人们使用的主要方法似乎就是这个!但由于某种原因,它仍然失败。任何帮助,将不胜感激。如果您提供替代解决方案,请确保它很快 - 这些配置文件可能很大。

2 个答案:

答案 0 :(得分:4)

以下是您可能正在做的事情的演示 - 如果没有更多代码,很难确定。

class ATest<T> {
  Map<String, String> props = new HashMap<String, String>();

  void aTest() {
    // Works fine.
    for (Map.Entry<String, String> entry : props.entrySet()) {
    }
  }

  void bTest() {
    ATest aTest = new ATest();
    // ERROR! incompatible types: Object cannot be converted to Entry<String,String>
    for (Map.Entry<String, String> entry : aTest.props.entrySet()) {
    }
  }

  void cTest(Map props) {
    // ERROR! incompatible types: Object cannot be converted to Entry<String,String>
    for (Map.Entry<String, String> entry : props.entrySet()) {
    }
  }

}

请注意,在bTest中,我创建了一个没有泛型类型参数的ATest。在这种情况下,Java会从类中删除所有一般信息,正如您将看到的那样,包括<String,String>内部props变量的信息。

或者 - 您可能会意外删除属性地图的一般特性 - 就像我在cTest中演示的那样。

答案 1 :(得分:-1)

尝试将地图声明为HashMap。

HashMap<String, String> props = new HashMap<String, String>();

这就是解决我的问题的原因。