8

下面的代码给了我编译时错误Type mismatch: cannot convert from int to byte

int i = 10;
byte b = i;

但下面没有

 final int i = 10;
 byte b = i;

我不明白为什么编译器会在 final 的情况下表现出来?

4

5 回答 5

7

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

编辑

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

于 2012-08-30T18:16:59.627 回答
3

案例 1:编译错误,因为 anint可能不适合 a byte; 显式转换是必要
的情况2:编译器将第二条语句编译为byte b = 10;(原样ifinal,所以没有错误

于 2012-08-30T18:21:31.073 回答
1

尝试这个

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

将此与

final int j=56;
byte b=j;

这将让您了解 int 到 byte 的隐式缩小是如何发生的,即只有在分配的值是常量表达式时才会发生

于 2012-08-30T19:46:45.863 回答
0

情况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;
于 2012-08-30T19:14:33.960 回答
0

我不明白为什么编译器将第二条语句编译为字节 b = 10 – anand

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

于 2012-08-30T18:31:18.023 回答