据我了解,变量评估是在运行时完成的。但是,类型评估是在Java编译时完成的。
正如我所看到的,使一个变量常量(我正在使用局部变量,但是上面的概念没有改变),将在编译时知道它的值。
我提供了两个示例来测试这个概念。第一个有效,第二个无效。
有人可以向我解释为什么将变量设为常量可以让我将短变量分配给int变量,而不能将int变量分配给long吗?
// Working example
final int x = 10;
short y = x;
// Non-working example
final long a = 10L;
int b = a;
答案 0 :(得分:15)
语言规范的相关部分为JLS 5.2, Assignment Contexts:
此外,如果该表达式是类型为byte,short,char或int的常量表达式(第15.28节):
- 如果变量的类型为byte,short或char,并且常量表达式的值可以表示为变量的类型,则可以使用缩窄基元转换。
使用a
和x
变量final
使它们成为常量表达式(因为它们也被常量值初始化了)。
第一个示例之所以有效,是因为x
是您要分配给int
变量的常量short
,并且该值可以用short
表示;第二个示例不是因为x
是常量long
,而您正试图将其分配给int
变量(该值是可表示的,但这并不重要,因为已经取消了隐式缩小转换的资格。