15

次のように、Javaがブール値からintへのキャストを許可しないのはなぜだろうと思っていました。

boolean foo = true;
int bar = (int)foo;

これは、1 行のコードで実行できます。たとえば、

bar = foo ? 1 : 0;

doubleしかし、 andのように、型キャストを許可する方が、より読みやすく、より良い方法のようintです。Java にこの機能が含まれていないのはなぜですか?

4

3 に答える 3

29

Java 設計者は、C および C++ でのブール値/整数のオーバーロードが重大なエラーの原因であることを (正しく) 認識していたため、これは許可されません。

(私はそれをいくつかの設計根拠で書いたのを見たのを覚えていますが、見つけることができません。)

例えば:

if (i = 0) {
    ...
}

合法ですが、おそらく C または C++ で書かれたアプリケーションのバグです。

booleanJava は、整数データ型を別の型に変換できない別個の型にすることで、この問題やその他の問題を回避します。したがって、上記は Java のコンパイル エラーです。

これはすべての場合に機能するわけではありません。例 (Java の場合):

if (flag = true) {
    ...
}

コンパイルします。ただし、価値のある十分なケースで機能します。さらに、Java で上記を記述する慣用的な方法は次のとおりです。

if (flag) {
    ...
}

落とし穴を完全に回避します。また、チェッカーは、不適切なバージョンを疑わしいものとしてフラグ付けするか、findbugsまたはフラグ付けする必要があります。(そして、スタイルチェッカーはそれが悪いスタイルpmdであることを示すべきです!)flag == true


これは、 aを an に明示的に型キャストできない理由を説明していません。しかし、それは次のことを観察することで理解できると思います。booleanint

  • 実際の Java プログラムでこれを行う必要はほとんどありません。

  • 数値 <-> ブール値のキャストは、他の型のキャストのようには機能しません。特に、他の型にはアップキャストとダウンキャストがあり、Java のアップキャスト1は明示的な型キャストを必要としません。

  • 数値と文字列の間、または文字列と他のオブジェクトの間で型キャストすることはできません。これらは変換であり、型キャストではありません。そしてint<->booleanもそうです。


1 - 私はここで私の用語をずさんにしています (意図的に)。正しい Java 用語は、「拡大」と「縮小」です。縮小変換には、リテラルの限られた例外を除いて、明示的な型キャストが必要です。拡大変換には型キャストは必要ありません。

于 2013-04-29T14:55:38.200 に答える
3

Java は、プリミティブ数値型の拡大変換をサポートしています。ただし、boolean は数値型とは見なされません。

サポートされている拡張変換は、Java 言語仕様の「拡張プリミティブ変換」の下にリストされています。

于 2013-04-29T14:56:09.287 に答える
2

Java は厳密に型指定されているため、 abooleanと anint are two completely different data typesと を他方にキャストすることはできません。実際、キャストすることはできません。

于 2013-04-29T14:54:01.460 に答える