2

K.Sierra は著書「SCJP スタディ ガイド」で、 「リテラル整数は常に int であることを知っていますが、さらに重要なことは、int サイズ以下のものを含む式の結果は常に int になることです」と述べています。

私は実験を始めましたが、以下の結果に少し混乱しています:

byte a = 1; // correct
byte b = 1 + a; // incorrect (needs explicit casting)
byte c = 1 + 1; // correct (I expected it to be incorrect)

最後の例でキャストが必要ない理由を誰かに説明してもらえますか? Javaコンパイラが暗黙のキャストを配置するのはなぜですか? int リテラルが 2 つあるからでしょうか。明確にしていただければ幸いです。

4

3 に答える 3

5

暗黙の型キャストは、の値がRHSでわかっている場合にのみ機能します。compile-timeつまり、であるということですcompile-time constants。それ以外の場合は、明示的な型キャストを行う必要があります。

それで: -

byte c = 1 + 1; // Value of `1 + 1` is known at compile time. Implicit cast
byte c = 1 + a; // Value of `1 + a` is evaluated at runtime. Explicit cast needed

また、変数aをとして宣言するfinal byte a = 1と、2番目の割り当てがコンパイルされます。その場合のaように、コンパイル時定数になります。

于 2012-10-22T11:54:36.540 に答える
4

はい、それはリテラルであるためです。つまり、コンパイル時定数であり、コンパイラーは結果のサイズが実際に1バイトであることを確認します。バイト範囲を超えると、同じことが失敗します。128をcに割り当ててみてください1 << 7。さらに言えば、127を超えるその他のコンパイル時定数を割り当ててみてください。

于 2012-10-22T11:53:44.107 に答える
1

「intサイズ以下のものを含む式の結果は常にintです」と述べたように

したがってbyte b = 1 + a; 、準拠時に評価されないint値を返します。したがって、コンパイラは、結果がバイト範囲内にあるかどうかをチェックできず、明示的なキャストを行うことを期待しています。

于 2012-10-22T11:56:42.087 に答える