【发布时间】:2020-10-31 22:09:04
【问题描述】:
整数字面量可以分配给字节或短变量只要字面量的值在字节/短的范围内。
但是将long literal赋值给int变量时,即使long literal的值在int范围内也会报编译错误。
解释这个的逻辑是什么?
例子,
下面这行编译成功
byte byteVar = 100; //works, here 100 is integer literal.
但是
int intVar = 100L; // fails, here 100L is long literal
导致编译时错误。
谁能解释一下驱动这个的底层逻辑。
【问题讨论】:
-
even when the value of long literal is within the range of int.不,long (64b) 大于 int (32b) docs.oracle.com/javase/tutorial/java/nutsandbolts/… -
int intVar = 100L;永远不会编译。您需要将其声明为长类型。您不能将 64 位长填充到 32 位整数中。 -
第二个赋值是从 long 到 int 的缩小转换,因此需要根据 JLS 进行显式转换。请参阅:docs.oracle.com/javase/specs/jls/se7/html/jls-5.html。
-
我想作者想知道为什么编译器不理解常量 100L 在不丢失信息的情况下适合 int。我想他们知道 Java 类型的提升以及何时需要转换,因为信息会丢失,例如当有小数位时从 double 到 long。我认为这是一个有趣的问题,尤其是因为 100L 是恒定的,不能改变。
-
@Fred 只是 Java 设计者的决定。
标签: java