class Foo{
public static void main(String args[]){
final int x=101;
int y;
if(x>100){
y=-1;
}
System.out.println(y);
}
}
Javaコンパイラは、ifステートメントの条件を常に真であると理解しているため、yは常に初期化されます。予想どおり、コンパイルエラーはありません。
class Bar{
public static void main(String args[]){
final int x;
x=101;
int y;
if(x>100){
y=-1;
}
System.out.println(y);
}
}
しかし、xの宣言と初期化を2行に分割すると、コンパイラは条件が常にtrueであり、yが常に初期化されることを認識していないようです。
final int x;
x=101;
byte b;
b=x;
System.out.println(b);
ここでも同じことが起こり、コンパイラは精度の低下エラーを出します。
final int x=101;
byte b;
b=x;
System.out.println(b);
この場合も、コンパイラーはxがbの範囲内にあることを理解できます。