为什么我不能将最终的long分配给一个int?

时间:2019-06-12 11:53:00

标签: java variable-assignment final

据我了解,变量评估是在运行时完成的。但是,类型评估是在Java编译时完成的。

正如我所看到的,使一个变量常量(我正在使用局部变量,但是上面的概念没有改变),将在编译时知道它的值。

我提供了两个示例来测试这个概念。第一个有效,第二个无效。

有人可以向我解释为什么将变量设为常量可以让我将短变量分配给int变量,而不能将int变量分配给long吗?

// Working example
final int x = 10;
short y = x;

// Non-working example
final long a = 10L;
int b = a;

1 个答案:

答案 0 :(得分:15)

语言规范的相关部分为JLS 5.2, Assignment Contexts

  

此外,如果该表达式是类型为byte,short,char或int的常量表达式(第15.28节):

     
      
  • 如果变量的类型为byte,short或char,并且常量表达式的值可以表示为变量的类型,则可以使用缩窄基元转换。
  •   

使用ax变量final使它们成为常量表达式(因为它们也被常量值初始化了)。

第一个示例之所以有效,是因为x是您要分配给int变量的常量short,并且该值可以用short表示;第二个示例不是因为x是常量long,而您正试图将其分配给int变量(该值是可表示的,但这并不重要,因为已经取消了隐式缩小转换的资格。