以下のコードでは:
final int a;
a=2;
byte b=a; // error: possible loss of precision
なぜこのエラーが発生するのですか? a
final 変数はコンパイル時の定数式ではないため、割り当て中に暗黙的にバイトに絞り込まれますか?
つまり、上記のコードは次のコードと同等ではありません。
final int a=2;
byte b=a;
以下のコードでは:
final int a;
a=2;
byte b=a; // error: possible loss of precision
なぜこのエラーが発生するのですか? a
final 変数はコンパイル時の定数式ではないため、割り当て中に暗黙的にバイトに絞り込まれますか?
つまり、上記のコードは次のコードと同等ではありません。
final int a=2;
byte b=a;
JLSから
空白
final
は、宣言final
に初期化子がない変数です。定数変数は、
final
プリミティブ型またはString
定数式 (§15.28) で初期化される型の変数です。
あなたの変数
final int a;
は空のfinal
変数です。初期化子がありません。宣言時に初期化されていないため、2 番目の段落は適用されません。したがって、これは定数式ではありません。
これはフィールドにも当てはまります。
コンパイラはそれほど賢くありません。
値は常に 2 であることがわかります。しかし、次のような場合はどうなるでしょうか。
class ABC{
final int a;
public ABC(){
if(Math.random() < .5){
a = 2;
}
else{
a = 12345;
}
byte b = a;
}
}
コンパイラは、これら 2 つのケースを区別するほどスマートではないため、代わりにエラーを返します。
最終変数は初期化が遅れる可能性があり、コンパイラは b が case 分岐に値を持つことを判断できません。