分配一个表达式的结果到一个原始(Assigning result of an expression

2019-08-01 18:25发布

K.Sierra在她的书“SCJP学习指南”中提到:“我们知道,一个面值整数始终是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文字? 澄清不胜感激。

Answer 1:

当你的价值类型映射隐只能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将是一个编译时间常数。



Answer 2:

是的,这是因为他们的文字,这意味着他们的编译时间常数,编译器保证了结果的大小确实是一个字节。 如果超出字节范围同样会失败。 尝试分配128到c或,对于这个问题, 1 << 7或任何其他编译时间常数大于127。



Answer 3:

作为所述的“涉及任何INT尺寸或更小的表达式的结果始终是一个int”

所以byte b = 1 + a; 返回未在complie时间评价一个int值。 因此,如果结果落在字节范围内,并预计我们把一个明确的转换编译器无法检查。



文章来源: Assigning result of an expression to a primitive