2

K.Sierra 在她的《SCJP 学习指南》一书中提到“我们知道文字整数始终是 int,但更重要的是,涉及任何 int 大小或更小的表达式的结果始终是 int。”

我已经开始试验,我对以下结果有点困惑:

byte a = 1; // correct
byte b = 1 + a; // incorrect (needs explicit casting)
byte c = 1 + 1; // correct (I expected it to be incorrect)

谁能向我解释为什么最后一个示例不需要强制转换?为什么 Java 编译器会进行隐式强制转换?是因为有 2 个 int 文字吗?澄清非常感谢。

4

3 回答 3

5

隐式类型转换仅在您的值RHS已知时才有效compile-time,意味着它们是compile-time constants。在其他情况下,您需要进行显式类型转换。

所以: -

byte c = 1 + 1; // Value of `1 + 1` is known at compile time. Implicit cast
byte c = 1 + a; // Value of `1 + a` is evaluated at runtime. Explicit cast needed

另外,请注意,如果您将变量声明afinal byte a = 1,那么第二个赋值将编译,在这种情况下,您a将是一个编译时间常量。

于 2012-10-22T11:54:36.540 回答
4

是的,这是因为它们是文字,这意味着它们是编译时常量,编译器确保结果的大小确实是一个字节。如果超出字节范围,同样会失败。尝试将 128 分配给 c 或者,就此而言,1 << 7或任何其他大于 127 的编译时常量。

于 2012-10-22T11:53:44.107 回答
1

正如所说“涉及任何 int 大小或更小的表达式的结果始终是 int”

因此byte b = 1 + a; 返回一个 int 值,该值在编译时未评估。因此编译器无法检查结果是否在字节范围内,并希望我们进行显式转换。

于 2012-10-22T11:56:42.087 回答