2

許可しないのは合理的なようです

int a = 8;
boolean b = (boolean)a;

結果として得られるブール値は整数でもfalseになるため、プログラマーエラーにつながる可能性がありますが、拡張強制が機能しないのはなぜint a = trueですか?

編集:

JVM仕様によると、セクション3.3.4:

Java仮想マシンは、ブール配列コンポーネントをエンコードします。1はtrueを表し、0はfalseを表します。Javaプログラミング言語のブール値がコンパイラによってJava仮想マシンタイプintの値にマップされる場合、コンパイラは同じエンコーディングを使用する必要があります。

例えば:

public static boolean returnFalse() {
    return false;
}

public static boolean returnTrue() {
    return true;
}

コンパイル先:

public static boolean returnFalse();
  Code:
     0: iconst_0
     1: ireturn

public static boolean returnTrue();
  Code:
     0: iconst_1
     1: ireturn
4

3 に答える 3

8

内部表現は関係ありません。

Java は強く型付けされています: anintは abooleanではなく、 abooleanは ではありませんint

これは設計上の決定です。true/false を使用する場合はブール値を使用してください。それは何かを伝えます。

true/falseを表すために整数を使用したい場合は、数学的比較を使用してください。これも問題ありません。

この言語は、設計上サポートしていないため、直接変換をサポートしていません。


JVM 仕様とブール値の内部表現に関して、次の文は興味深いものです。

Java プログラミング言語のブール値がコンパイラによって Java 仮想マシン タイプ int の値にマップされる場合、コンパイラは同じエンコーディングを使用する必要があります。

私には、次のように書かれています。

コンパイラ/VM が VM 整数を使用して true/false を表す場合1 /0 規則を使用する必要があります。つまり、コンパイラ/VMがtrue/false に VM 整数を使用していない場合、これは要件ではありません。

この点を明確にすることは興味深いことですが、最終的には関係ありません。

于 2012-06-08T19:33:07.050 に答える
0

Java は、false の場合は 0、true の場合は 1 を保持する C++ ではありません。Java boolean では、別のデータ型です。C++ では、ブール値を持つために少なくとも 1 バイトが必要です。Java では、JVM の実装に依存します。

于 2012-06-08T19:11:27.727 に答える
0

C++ などの言語では 0 が false であり、他のすべての整数が true であるというのは単なる規則です。Java には、ブール値を整数に指定する規則がありません。

「int a = true などの拡張型強制が機能しないのはなぜですか」と混乱しています。

于 2012-06-08T19:13:54.027 に答える