byte b = 100 ;
エラーなしでコンパイルされますが、
int i = 100 ;
byte b = i ;
エラーをスローします。なんで?100をbに直接割り当てる場合でも、intリテラルを割り当てています。では、なぜエラーが発生したのですか?
byte b = 100 ;
エラーなしでコンパイルされますが、
int i = 100 ;
byte b = i ;
エラーをスローします。なんで?100をbに直接割り当てる場合でも、intリテラルを割り当てています。では、なぜエラーが発生したのですか?
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
そしてその場合、上記の場合のように、後で来て、との間にあるの値を変更することができます。これは確かに失敗します。そのため、コンパイラはタイプへの割り当てを許可しません。i
initialization of i
assignment of i to byte
i
byte
ただし、明示的なキャストを使用してコンパイルすることはできます。もちろん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
はコンパイル時定数ですが、に収まるほど大きくはなくbyte
、compiler
知っているからです。
i
最終的なものではなく、その間に変更された可能性があります。
以下が機能します:
final int i = 100;
byte b = i;
byte b=100
バイトの範囲が-128から127であるため、コンパイルされます。
int i = 100 ; byte b = 129 ;// would give a compiler error