8

次のコードは、コンパイル時エラーを示しますタイプの不一致:intからbyteに変換できません

int i = 10;
byte b = i;

しかし、以下はしません

 final int i = 10;
 byte b = i;

ファイナルの場合にコンパイラが動作する理由がわかりませんか?

4

5 に答える 5

7

10が1バイトに収まるからだと思いますが、整数が8ビットを超えるものであると、この割り当てを適切に行うことができなくなります。

編集

明確にするために、それをfinalにすることは、コンパイラーがintを定数として扱い、定数畳み込みを実行できるようにすることです。コンパイル時にその値を認識せず、バイトが保持できる値よりもはるかに大きくなる可能性があるため、final以外のintでの割り当てが妨げられている可能性があります。

于 2012-08-30T18:16:59.627 に答える
3

intケース1:;に収まらない可能性があるため、コンパイルエラーbyte。明示的なキャストが必要です
ケース2:コンパイラは2番目のステートメントをbyte b = 10;(そのまま)にコンパイルするため、エラーは発生しませifinal

于 2012-08-30T18:21:31.073 に答える
1

これを試して

int i=45;
final int j=i;
byte b=j;

これをと比較してください

final int j=56;
byte b=j;

これにより、intからbyteへの暗黙的なナローイングがどのように行われるか、つまり、割り当てられた値が定数式である場合にのみ行われることがわかります。

于 2012-08-30T19:46:45.863 に答える
0

コンパイラが2番目のステートメントをバイトb=10にコンパイルする理由がわかりませんでした– anand

これは、変数「i」が常に値として「10」を保持するようにコンパイラーに指示しているためです。したがって、コンパイラは、参照される場所で「i」を「10」に置き換えます。そうすることで、JVMの作業が簡単になります。

于 2012-08-30T18:31:18.023 に答える
0

ケース1:

int i = 10;
byte b = i;

intプリミティブ型の値の範囲は、 -2,147,483,648 [-231]別名Integer.MIN_VALUEから+2,147,483,647 [2 31-1]別名Integer.MAX_VALUEです。

int i= 10 つまり、コンパイラはintの値が-2,147,483,648[-231]から+2,147,483,647[2 31-1]までの範囲であると想定しますが、byteはこの値を保持できません。したがって、コンパイラはエラーを出します。

ケース2:

final int i = 10;
byte b = i;

ここで、int変数はfinalとして宣言され、10に初期化されます。byteは-128〜127の値を保持でき、プログラム全体で変更されることはありません。このため、コンパイラはエラーを出しません。

同じ変数を128で宣言すると、エラーが発生します。元:

final int i = 128;
byte b = i;
于 2012-08-30T19:14:33.960 に答える