将表达式的结果分配给基元

时间:2012-10-22 11:51:29

标签: java primitive scjp

K.Sierra在她的书“SCJP学习指南”中提到“我们知道一个文字整数总是一个int,但更重要的是,涉及任何int-sized或更小的表达式的结果总是一个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个文字吗?澄清非常感谢。

3 个答案:

答案 0 :(得分: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

另请注意,如果将变量a声明为final byte a = 1,则第二个赋值将进行编译,因为在这种情况下,您的a将是编译时常量。

答案 1 :(得分:4)

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

答案 2 :(得分:1)

如上所述“涉及任何大小或更小的表达式的结果总是一个int”

因此byte b = 1 + a;返回一个在complie时未计算的int值。因此,如果结果落在字节范围内并且期望我们进行显式转换,则编译器无法检查它。