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 に答える