我正在开发一个简单的配置文件阅读器,但我在编写测试方法时遇到了一个奇怪的错误。它是一个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());
}
}
}
map
是Map<String, String>
,所以这不是问题所在。我用Google搜索了另外一种方法,但人们使用的主要方法似乎就是这个!但由于某种原因,它仍然失败。任何帮助,将不胜感激。如果您提供替代解决方案,请确保它很快 - 这些配置文件可能很大。
答案 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>();
这就是解决我的问题的原因。