下面的代码给出了编译时错误类型不匹配:无法从int转换为字节
int i = 10;
byte b = i;
但下面没有
final int i = 10;
byte b = i;
我不明白为什么编译器在最终的情况下会表现?
答案 0 :(得分:7)
我认为这是因为10适合一个字节,但如果整数超过8位,那么就不能再正确地完成这个任务了。
修改强>
澄清一下,使其最终允许编译器将int视为常量,以便它可以进行常量折叠。它可能会阻止使用非final int进行赋值,因为它在编译时不知道该值,并且它可能比字节可以容纳的值大。
答案 1 :(得分:3)
案例1:编译错误,因为int
可能不适合byte
;需要明确的演员
情况2:编译器将第二个语句编译为byte b = 10;
(i
为final
),因此没有错误
答案 2 :(得分:1)
试试这个
int i=45;
final int j=i;
byte b=j;
将此与
进行比较final int j=56;
byte b=j;
这将让您了解如何将int到字节的隐式缩小发生,即只有在指定的值是常量表达式时才会发生
答案 3 :(得分:0)
我没理解为什么编译器将第二个语句编译为字节b = 10 - anand
那是因为,你指示编译器变量'i'将始终保持'10'作为值。因此,无论引用何处,编译器都会将'i'替换为'10'。通过这样做,它将使JVM的工作更容易!
答案 4 :(得分:0)
案例1:
int i = 10;
byte b = i;
int
原始类型值的范围可以从-2,147,483,648 [-231]
又名Integer.MIN_VALUE
到+2,147,483,647 [2 31-1]
又名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 program更改。因为这个原因编译器没有给出任何错误。
如果用128声明相同的变量,则会出错。 例如:
final int i = 128;
byte b = i;