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文字? 澄清不胜感激。
当你的价值类型映射隐只能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
将是一个编译时间常数。
是的,这是因为他们的文字,这意味着他们的编译时间常数,编译器保证了结果的大小确实是一个字节。 如果超出字节范围同样会失败。 尝试分配128到c或,对于这个问题, 1 << 7
或任何其他编译时间常数大于127。
作为所述的“涉及任何INT尺寸或更小的表达式的结果始终是一个int”
所以byte b = 1 + a;
返回未在complie时间评价一个int值。 因此,如果结果落在字节范围内,并预计我们把一个明确的转换编译器无法检查。