文字中的隐式转换

implicit conversion in literals

默认情况下,Java 假定您正在定义一个带有文字的 int 值。

short x = 20; // There is an implicit conversion

但是当我们在算术表达式中使用"x"变量时,例如:

short y = x * 2; //DOES NOT COMPILE

我们知道 20 * 2 的结果是 40,这可以很容易地放入一个短变量中。 这是怎么回事?

我不知道编译器的实现细节。我想原因是编译器无法检查,因为在编译时可能不知道 x 的值。所以它只能假设它是一个int。否则,您还希望编译器表现如何?

如果你看*运算符原型, 参见:https://www.cs.cmu.edu/~pattis/15-1XX/15-200/lectures/voe/lecture.html

(int, int) 只有一个,所以从技术上讲 (short, short) 没有。

那么您可能会问为什么 short x = 20 有效? 原因是 Java 仅当它是一个常量时才允许自动转换,在这种情况下“20”是最终的,而 x*2 不是最终的 看: Java - short and casting

当你写 short x =20 然后 java 编译成功但是当你写 short y=x *2 然后它会被视为 int 并且你必须将它转换为 short 像 short y =(short)x*2

因为 x 不是最终的,所以不能保证当程序到达以下点时变量仍然是 20:

short y = x * 2;

编译器只是考虑到您的非最终变量 x 到那时可能已经更改(通过任何方式)的可能性,因此不会将其简单地视为 20。 如果您将 x 定义为 final,则隐式对话将起作用:

final short x = 20; // There is an implicit conversion
short y = x * 2; //DOES COMPILE

你可以使用下面的记法使用转换将算术运算的结果赋值给y(如果你不想xfinal):

short y = (short)(x * 2);

我认为答案在 Java 语言规范中。查看第 4.2.2 点,有一个数值运算符列表可生成 int 或 long 类型的值,这就是为什么 java 将其视为 int 并需要强制转换的原因: https://docs.oracle.com/javase/specs/jls/se9/html/jls-4.html#jls-4.2.2