1
byte b = 100 ; 

エラーなしでコンパイルされますが、

int i = 100 ; 
byte b = i ; 

エラーをスローします。なんで?100をbに直接割り当てる場合でも、intリテラルを割り当てています。では、なぜエラーが発生したのですか?

4

3 に答える 3

5
byte b = 100 ;

これ100がコンパイル時定数です。したがって、に割り当てることができますbyte

int i = 100 ; 
// i = i + 100;  // It's allowed to add this statement later on, 
                 // if `i` is not declared final. And hence, the next assignment
                 // will clearly fail at runtime. So, compiler saves you from it
byte b = i ; 

この場合、iは宣言されていないので、定数finalではなくなります。compile timeそしてその場合、上記の場合のように、後で来て、との間にあるの値を変更することができます。これは確かに失敗します。そのため、コンパイラはタイプへの割り当てを許可しません。iinitialization of iassignment of i to byteibyte

ただし、明示的なキャストを使用してコンパイルすることはできます。もちろんcrash、実行時に実行することもできます。明示的なキャストを行うことで、コンパイラーに「自分が何をしているのかはわかっているので、自分のためにやってください」と伝えます。したがって、そのキャストの実行時の動作を気にすることはなく、何も悪いことをしていないことを信頼します。

int iしたがって、自分をとして宣言するかfinal、キャストを行う必要があります。-

int i = 100 ;    // replace 100 with 130, and you will be surprised that it works
byte b = (byte)i ; 

したがって、値を使用して130それをにキャストするとbyte、を通過しますがcompiler、実行時に確実にクラッシュします。そして、これはがcompiler避けようとしていた問題です。


最初のケースに戻りましょう:-

byte b = 128;

上記の割り当てはコンパイルに失敗します。値128はコンパイル時定数ですが、に収まるほど大きくはなくbytecompiler知っているからです。

于 2012-12-04T14:45:13.493 に答える
1

i最終的なものではなく、その間に変更された可能性があります。

以下が機能します:

final int i = 100; 
byte b = i;
于 2012-12-04T14:43:26.187 に答える
1

byte b=100バイトの範囲が-128から127であるため、コンパイルされます。

    int i = 100 ; byte b = 129 ;// would give a compiler error
于 2012-12-04T14:41:11.777 に答える