public class Java{
public static void main(String[] args){
final byte x = 1;
final byte y = 2;
byte z = x + y;//ok
System.out.println(z);
byte a = 1;
byte b = 2;
byte c = a + b; //Compiler error
System.out.println(c);
}
}
2バイトの合計が1バイトに収まる場合でも、intサイズ以下のものが含まれる式の結果が常にintである場合。
1バイトに収まる2つの最終バイトを追加するとどうして起こるのですか?コンパイラエラーはありません。
さらに、式がbyte、short、char、またはint型の定数式(§15.28)の場合:-縮小プリミティブ変換は、変数のタイプがバイト、ショート、またはチャーであり、定数式の値が変数のタイプで表現できる場合に使用されます。
つまり、式の値(定数式なのでコンパイル時に認識されます)は、バイトである変数の型で表現できます。
あなたの表現を考えて
final byte x = 1;
final byte y = 2;
byte z = x + y;//This is constant expression and value is known at compile time
そのため、合計がバイトに収まるため、コンパイルエラーは発生しません。
今なら
final byte x = 100;
final byte y = 100;
byte z = x + y;// Compilation error it no longer fits in byte
byte z = x + y; // x and y are declared final
ここでは、x
とy
がfinal
として宣言されているため、RHS
の式の値はコンパイル時にわかり、(1 + 2 = 3)
と変化させることはできません。したがって、明示的に型キャストする必要はありません
byte c = a + b; // a and b are not declared final
一方、この場合、a
とb
の値は最終的に宣言されていません。したがって、式の値はコンパイル時には不明であり、実行時に評価されます。したがって、明示的なキャストを行う必要があります。
ただし、1番目のコードでも、a + b
が範囲外であることが判明しました-128 to 127
、コンパイルに失敗します。
final byte b = 121;
final byte a = 120;
byte x = a + b; // This won't compile, as `241` is outside the range of `byte`
final byte b1 = 12;
final byte a1 = 12;
byte x1 = a1 + b1; // Will Compile. byte can accommodate `24`