2 回答
TA贡献1862条经验 获得超7个赞
从JLS 5.2分配转换
另外,如果该表达式是类型为byte,short,char或int的常量表达式(第15.28节):-如果变量的类型为byte,short或char,且值是常数表达式的可以表示为变量的类型。
简而言之,表达式的值(在编译时就知道了,因为它是一个常量表达式)可以用字节类型的变量表示。
考虑你的表情
final byte x = 1;
final byte y = 2;
byte z = x + y;//This is constant expression and value is known at compile time
因此,由于求和适合字节,因此不会引发编译错误。
现在,如果你这样做
final byte x = 100;
final byte y = 100;
byte z = x + y;// Compilation error it no longer fits in byte
TA贡献1865条经验 获得超7个赞
byte z = x + y; // x and y are declared final
在这里,由于x和y被声明,final所以RHS在编译时就知道的表达式的值,该值固定为(1 + 2 = 3)并且不能改变。因此,您无需明确地进行类型转换
byte c = a + b; // a and b are not declared final
但是,在这种情况下,a和的值b未声明为最终值。因此,表达式的值在编译时未知,而是在运行时求值。因此,您需要进行显式转换。
但是,即使在第一个代码中,如果的值a + b超出范围-128 to 127,它也将无法编译。
final byte b = 121;
final byte a = 120;
byte x = a + b; // This won't compile, as `241` is outside the range of `byte`
final byte b1 = 12;
final byte a1 = 12;
byte x1 = a1 + b1; // Will Compile. byte can accommodate `24`
添加回答
举报