为什么Eclipse指出最后一个错误下面的代码" X"
int a = 1;
final int X = a;
byte b = X;
类型不匹配:无法从int转换为字节
虽然下面的代码没有?
final int Y =10;
byte b2 = Y;
答案 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
范围的表达式,因此会触发错误。