java类型转换问题

时间:2018-03-31 09:33:11

标签: java eclipse type-conversion

为什么Eclipse指出最后一个错误下面的代码" X"

int a = 1;
final int X = a;
byte b = X;
  

类型不匹配:无法从int转换为字节

虽然下面的代码没有?

final int Y =10;
byte b2 = Y;

2 个答案:

答案 0 :(得分:3)

当你这样做时:

final int Y =10;
byte b2 = Y;

编译器知道Y的值是有效的byte范围值,并且由于final修饰符,永远不会更改

而第一个例子:

int a = 1;
final int X = a;
byte b = X;

a可以是任何值,当我们使用final修饰符标记它时,我们不知道它是否是有效byte范围值因此这样做的:

byte b = X;

将导致编译错误。

如果你这样做:

final int a = 1;
final int X = a;
byte b = X;

然后它也会像你提供的第二个例子一样工作。

答案 1 :(得分:2)

这种行为归结为最终变量和常量变量之间的区别。

根据Java语言规范4.12.4

  

我们调用一个原始类型或类型String的变量,它是final,并使用编译时常量表达式常量变量进行初始化。

在您的第一个示例中,X是从另一个变量初始化的,因此它只是一个最终变量。在第二个示例中,Y是从常量表达式初始化的,因此它是一个常量变量。

Java可以在第二个代码示例中使用其Y值的知识来确定没有缩小到byte的转换。允许将byte b2 = Y视为byte b2 = 10

在第一个示例中,X不是常量表达式,因此编译器必须将其视为可能超出byte范围的表达式,因此会触发错误。