Java类型转换问题

3
为什么Eclipse在最后一个“X”下方指出了错误
int a = 1;
final int X = a;
byte b = X;

类型不匹配:无法将int转换为byte

而下面的代码却没有出现这个问题?

final int Y =10;
byte b2 = Y;
2个回答

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;

那么它也将像您提供的第二个示例一样正常工作。

2
这种行为归结于最终变量和常量变量之间的区别。根据Java语言规范4.12.4,我们称一个基本类型或String类型的变量,如果它是最终的并且用编译时的常量表达式初始化,那么它就是一个常量变量。在你的第一个例子中,X是从另一个变量初始化的,因此它只是一个最终变量。在你的第二个例子中,Y是从一个常量表达式初始化的,所以它是一个常量变量。Java可以利用其对第二个代码示例中Y值的了解来确定没有缩小转换为byte。它允许将byte b2 = Y视为byte b2 = 10。然而,在第一个例子中,X不是一个常量表达式,因此编译器必须将其视为可能超出byte范围的表达式,因此会触发错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接