1

我测试 SnakeYAML 库以读取 .yaml 文档。我已阅读示例 2.27。来自http://yaml.org/spec/1.1/的发票,我得到了对象:

System.out.println(content);
Yaml yaml = new Yaml();
Object o = yaml.load(content);

其中内容是使用 Files.readAllBytes、encoding.decode 从文件加载的字符串(编码为 StandardCharsets.UTF_8)

反射让我知道 o 是 java.util.LinkedHashMap 的类型,我可以遍历它们:

Set entrySet = o.entrySet();
Iterator it = entrySet.iterator();
System.out.println("LinkedHashMap entries : ");
while (it.hasNext())
{
    Object entry = it.next();
    System.out.println(entry);
}

反射返回的条目类型是 LinkedHashMap$Entry。但问题是:内部类 LinkedHashMap$Entry 是私有的,我不能声明这种类型的对象。如何从条目、迭代器或 entrSet 中获取对?

4

2 回答 2

5

您应该声明 aMap.Entry而不是LinkedHashMap.Entry

while (it.hasNext())
{
    Map.Entry<?,?> entry = it.next();
    System.out.println(entry.getKey());
    System.out.println(entry.getValue());
}

Map.Entrypublic interface,LinkedHashMap.Entry是该接口的私有实现。

请注意,我还声明了Entrywith <?,?>,这是一个泛型声明。如果您知道的类型,Map您可以声明该类型并且您不需要强制转换:

Set<Entry<?,?>> entrySet = o.entrySet();
Iterator<Entry<?,?>> it = entrySet.iterator();

此外,您可以使用增强的 foreach 循环进行迭代:

final Map<?,?> myMap = (Map<?,?>) yaml.load(content);
for(final Entry<?,?> entry : o.entrySet()) {
    //do stuff with entry
}

显然,如果你知道你Map正在映射StringObject(例如)你可以使用Map<String, Object>

于 2013-09-19T16:24:14.320 回答
1

查看发布在以下位置的示例: Java - LinkedHashMap 类以及 如何获取 LinkedHashMap 的 keyIterator?

于 2013-09-19T16:29:25.567 回答