下面的代码给了我编译时错误Type mismatch: cannot convert from int to byte
int i = 10;
byte b = i;
但下面没有
final int i = 10;
byte b = i;
我不明白为什么编译器会在 final 的情况下表现出来?
下面的代码给了我编译时错误Type mismatch: cannot convert from int to byte
int i = 10;
byte b = i;
但下面没有
final int i = 10;
byte b = i;
我不明白为什么编译器会在 final 的情况下表现出来?
我认为这是因为 10 适合一个字节,但如果整数需要超过 8 位,那么它将无法再正确地执行此分配。
编辑
澄清一下,将其设为 final 是允许编译器将 int 视为常量,以便它可以进行常量折叠。它可能会阻止使用非最终 int 进行分配,因为它在编译时不知道该值,并且它可能比一个字节可以容纳的值大得多。
案例 1:编译错误,因为 anint
可能不适合 a byte
; 显式转换是必要
的情况2:编译器将第二条语句编译为byte b = 10;
(原样i
)final
,所以没有错误
尝试这个
int i=45;
final int j=i;
byte b=j;
将此与
final int j=56;
byte b=j;
这将让您了解 int 到 byte 的隐式缩小是如何发生的,即只有在分配的值是常量表达式时才会发生
情况1 :
int i = 10;
byte b = i;
int
原始类型值的范围可以从 -2,147,483,648 [-231]
akaInteger.MIN_VALUE
到+2,147,483,647 [2 31-1]
aka Integer.MAX_VALUE
。
int i= 10
意味着编译器假定 int 的值可以从 -2,147,483,648 [-231] 到 +2,147,483,647 [2 31-1],但 byte 不能保存这个值。因此编译器给出了错误。
案例2:
final int i = 10;
byte b = i;
这里 int 变量声明为 final 并初始化为 10。 byte 可以保存 -128 到 127 之间的值,并且不会通过 out 程序更改。由于这个原因,编译器没有给出任何错误。
如果您用 128 声明相同的变量,则会出错。前任:
final int i = 128;
byte b = i;
我不明白为什么编译器将第二条语句编译为字节 b = 10 – anand
那是因为,您正在指示编译器变量“i”将始终保持“10”作为值。因此,无论在何处引用,编译器都会将“i”替换为“10”。通过这样做,它将使 JVM 的工作更容易!