次のコードは、コンパイル時エラーを示しますタイプの不一致:intからbyteに変換できません
int i = 10;
byte b = i;
しかし、以下はしません
final int i = 10;
byte b = i;
ファイナルの場合にコンパイラが動作する理由がわかりませんか?
次のコードは、コンパイル時エラーを示しますタイプの不一致:intからbyteに変換できません
int i = 10;
byte b = i;
しかし、以下はしません
final int i = 10;
byte b = i;
ファイナルの場合にコンパイラが動作する理由がわかりませんか?
10が1バイトに収まるからだと思いますが、整数が8ビットを超えるものであると、この割り当てを適切に行うことができなくなります。
編集
明確にするために、それをfinalにすることは、コンパイラーがintを定数として扱い、定数畳み込みを実行できるようにすることです。コンパイル時にその値を認識せず、バイトが保持できる値よりもはるかに大きくなる可能性があるため、final以外のintでの割り当てが妨げられている可能性があります。
int
ケース1:;に収まらない可能性があるため、コンパイルエラーbyte
。明示的なキャストが必要です
ケース2:コンパイラは2番目のステートメントをbyte b = 10;
(そのまま)にコンパイルするため、エラーは発生しませi
んfinal
これを試して
int i=45;
final int j=i;
byte b=j;
これをと比較してください
final int j=56;
byte b=j;
これにより、intからbyteへの暗黙的なナローイングがどのように行われるか、つまり、割り当てられた値が定数式である場合にのみ行われることがわかります。
コンパイラが2番目のステートメントをバイトb=10にコンパイルする理由がわかりませんでした– anand
これは、変数「i」が常に値として「10」を保持するようにコンパイラーに指示しているためです。したがって、コンパイラは、参照される場所で「i」を「10」に置き換えます。そうすることで、JVMの作業が簡単になります。
ケース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;