【问题标题】:SnakeYAML loads Objects that cannot be used conventionallySnakeYAML 加载常规无法使用的对象
【发布时间】:2013-07-24 21:33:12
【问题描述】:

所以我正在使用此代码加载 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 。这让我很困惑。为什么,当我得到 objects 类时,它是否返回我想要的类型,但该对象不能在所述类型的上下文中使用?

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

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

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

【问题讨论】:

    标签: java object compiler-errors primitive snakeyaml


    【解决方案1】:

    这是一个纯 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。

    【讨论】:

      猜你喜欢
      • 2019-10-04
      • 2016-10-26
      • 2012-02-12
      • 2011-07-10
      • 2020-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      相关资源
      最近更新 更多