2013-04-29 15 views
13

Javaはそうのように、int型にブールからキャストすることはできませんなぜ私が思っていた:これは、例えば、1行のコードで行うことができますJavaがブール - > Intキャストを許可しないのはなぜですか?

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

bar = foo ? 1 : 0; 

が、 doubleintのように、より簡単で読みやすい方法がタイプキャストを許可するように思えます。 Javaにこの機能が含まれていないのはなぜですか?

+16

'int'は' boolean'ではないためです。 –

+1

キャスティングのルールは何ですか?ゼロは偽です、それ以外は真ですか?負の数値はどのように扱われますか?あなたは数学をすることを許されますか? –

+5

*「なぜJavaにはこの機能が含まれていないのですか?」* Javaには、単一のコード行で実現できる多くのことが含まれていません。私はその理由として「APIが肥大化する」と思います。 –

答えて

23

これは、JavaデザイナーがCとC++のブーリアン/整数オーバーロードが重大なエラーの原因であることを正しく認識しているため、許可されません。

は(私はいくつかの設計上の根拠に書面でそれを見て思い出すが、私はそれを見つけることができません。)例えば

if (i = 0) { 
    ... 
} 

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

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


明示的タイプはintbooleanをキャストすることはできませんなぜ今、これは説明しません。しかし、私はそれが次のことを観察することによって理解することができると思う:

  • あなたはまれ実際のJavaプログラムであることを行う必要があります。

  • 数字< - >ブール型キャストは、他の型キャストが動作する方法ではジェルしません。特に、他のタイプの場合、アップキャストとダウンキャストがあり、アップストリームキャストは、明示的な型キャストを必要としません。

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


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

+0

あなたの例題はトピックとどのように関連していますか?おそらくC/C++のバグでしょう。なぜなら、実際にiに値を割り当てているからです。これはJavaのif節ではサポートされていません。どのような型のブール値との関係ですか? – Nearoo

+0

この例は、Java言語設計の決定が 'int'から' boolean'へのキャストを許可しない理由*を示しているため、関連しています。 –

+0

ああ、私は今それを得るが、あなたの説明のために(申し訳ありません)。次の例は関連性があります:式 'a = k'は常に' k'を返します。だから 'if(1)'はJavaが 'bool'に' int'をキャストしないので不正です。評価するので、 'if(a = 1)'は動作しません。しかし、これは本当にバグが起こりやすいという事実ですか? 'if(a = true)'は依然として合法であるためです。 – Nearoo

2

Javaは強く型付けされているので、booleanint are two completely different data typesと、一方が他方にキャストすることはできません - それはは実際には、キャストすることはできません。

+18

トートロジー。キャストできないのでキャストできません。 –

3

Javaでは、プリミティブな数値型の変換を拡大できます。ただし、booleanは数値型とはみなされません。

サポートされている拡大変換は、Java言語仕様の"Widening Primitive Conversion"にリストされています。

関連する問題