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

时间:2012-08-30 18:15:13

标签: java

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

int i = 10;
byte b = i;

但下面没有

 final int i = 10;
 byte b = i;

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

5 个答案:

答案 0 :(得分:7)

我认为这是因为10适合一个字节,但如果整数超过8位,那么就不能再正确地完成这个任务了。

修改

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

答案 1 :(得分:3)

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

答案 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;