45

以下のコードでは:

final int a;
a=2;
byte b=a;   // error: possible loss of precision

なぜこのエラーが発生するのですか? afinal 変数はコンパイル時の定数式ではないため、割り当て中に暗黙的にバイトに絞り込まれますか?

つまり、上記のコードは次のコードと同等ではありません。

final int a=2;
byte b=a;
4

3 に答える 3

51

JLSから

空白finalは、宣言finalに初期化子がない変数です。

定数変数は、finalプリミティブ型または String定数式 (§15.28) で初期化される型の変数です。

あなたの変数

final int a;

空のfinal変数です。初期化子がありません。宣言時に初期化されていないため、2 番目の段落は適用されません。したがって、これは定数式ではありません。

これはフィールドにも当てはまります。

于 2015-06-11T15:37:00.937 に答える
43

コンパイラはそれほど賢くありません。

値は常に 2 であることがわかります。しかし、次のような場合はどうなるでしょうか。

class ABC{
    final int a;

    public ABC(){
       if(Math.random() < .5){
          a = 2;
       }
       else{
          a = 12345;
       }

       byte b = a;
    }
}

コンパイラは、これら 2 つのケースを区別するほどスマートではないため、代わりにエラーを返します。

于 2015-06-11T15:43:46.690 に答える
2

最終変数は初期化が遅れる可能性があり、コンパイラは b が case 分岐に値を持つことを判断できません。

于 2015-06-11T15:37:50.263 に答える