SnakeYAML加载常规无法使用的对象

时间:2013-07-24 21:33:12

标签: java object compiler-errors primitive snakeyaml

所以我使用此代码加载YAML文件。

String file = "A: true\nB: 5"
Yaml yaml = new Yaml();
Map settings = (Map) yaml.load(file);

System.out.println(settings.get("A"));

最后一行打印出来:

class    java.lang.Boolean

这是预料之中的。但是,当我尝试实际使用布尔值时,例如使用基本的if语句:

if (settings.get("A")) {
    System.out.println("We want to do A!");
}

此语句抛出错误:

java: incompatible types
    required: boolean
    found:    java.lang.Object

告诉我if语句期望一个布尔值但是收到了一个java.lang.Object。这让我很困惑。为什么,当我得到对象类时,它是否返回我想要的类型,但该对象不能在所述类型的上下文中使用?

起初,我天真地认为可能是SnakeYAML返回Object类型的子类而不是原始类型。经过一些测试和少量思考,我意识到这不是我的问题的原因。

我意识到我可以通过简单地将每个值作为其各自的类型来修复此错误,但我的YAML文件包含许多不同的值,我不想在每次引用它时手动转换...有点首先打败了我使用YAML的目的。

无论如何,深入了解为什么我不能使用一个认为它的布尔作为布尔的对象。

1 个答案:

答案 0 :(得分:0)

这是一个纯粹的java问题。

Map settings = new HashMap();
if (settings.get("A")) {
    System.out.println();
}
出于同样的原因,

会给你相同的编译错误 - Map(没有类型模板)有Object键和Object值。

但是,使用类型模板对您的情况没有帮助,因为在编译时无法知道值的类型。想一想:如果将输入更改为“A:hello \ nB:5”,则settings.get(“A”)的运行时类型将为java.lang.String。

因此,如果将输入更改为非布尔值,则必须坚持使用显式转换并获取ClassCastException。