1

所以我正在使用这段代码加载一个 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。

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

4

1 回答 1

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。

于 2013-09-18T11:54:43.267 回答