在转换的情况下Java编译时错误

下面的代码给出了编译时错误类型不匹配:无法从int转换为byte

int i = 10; byte b = i; 

但下面没有

  final int i = 10; byte b = i; 

我不明白为什么编译器在最终的情况下表现?

我认为这是因为10适合一个字节,但如果整数是超过8位的东西,那么它将无法正确地执行此分配。

编辑

为了澄清,使其成为最终允许编译器将int视为常量,以便它可以进行常量折叠。 它可能会阻止使用非final int赋值,因为它在编译时不知道该值,并且它可能比字节可以容纳的值大。

情况1:编译错误,因为int可能不适合一个byte ; 明确的演员是必要的
情况2:编译器将第二个语句编译为byte b = 10; (因为ifinal ),所以没有错误

试试这个

 int i=45; final int j=i; byte b=j; 

比较这个

 final int j=56; byte b=j; 

这将让你知道如何将int到字节的隐式缩小发生,即只有在赋值为常量表达式时才会发生这种情况

我没理解为什么编译器将第二个语句编译为字节b = 10 – anand

那是因为,你指示编译器变量’i’将始终保持’10’作为值。 因此,无论引用何处,编译器都会将’i’替换为’10’。 通过这样做,它将使JVM的工作更容易!

情况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;