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

Geo*_*lev 9 java final variable-assignment

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

同样,正如我所见,使变量恒定(我正在使用局部变量,但是上面的概念没有改变),将在编译时知道其值。

我提供了两个示例来测试这个概念。第一个起作用,第二个不起作用。

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

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

// Non-working example
final long a = 10L;
int b = a;
Run Code Online (Sandbox Code Playgroud)

And*_*ner 15

语言规范的相关部分是JLS 5.2,分配上下文

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

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

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

第一个示例之所以有效,x是因为int您尝试将其分配给short变量,并且该值可以用表示short;第二个示例不是因为它x是一个常量long,而是试图将其分配给一个int变量(该值是可表示的,但这无关紧要,因为它已经不符合隐式变窄转换的资格)。

  • @GeorgiVelev“我不知道我不能使长常量成为常数”,您可以:它仍然是[常量表达式](https://docs.oracle.com/javase/specs/jls/se12/html/jls-15.html# jls-15.28)。您只是不能在此特定上下文中使用它。(例如,如果不是常量表达式,则无法在示例代码中使用s作为大小写标签(在此示例代码中)(https://ideone.com/IOw4Yo)) (3认同)
  • @tobias_k对* why *的任何答案都是猜测,除非由参与编写规范的人员提供。我会坚持事实求答案。我的猜测是,这种行为主要是由于该语言中缺少字节/短文字而存在的,因此它消除了分配该类型变量的小麻烦;而且,为什么不将其扩展到所有常量表达式,允许它比禁止更容易。但是由于同时有long和int文字,因此最初不需要将它长期提供给int。但是就像我说的那样:仅仅是猜测。 (2认同)