本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看 活动链接
Debug 笔记 <Java中的原始转换和赋值>
提问
我了解以下错误的原因:
byte a = 3;
byte b = 8;
byte c = a + b; // compile error
它不会编译。表达式始终导致int。因此,我们应该进行显式转换:
byte c = (byte) (a + b); // valid code
但是我不明白为什么以下是正确的:
byte d = 3 + 8; // it's valid! why?
因为文字整数(例如3或8)始终隐式为int。
而且int-or-smaller总是导致int。谁能解释这是怎么回事?
我唯一能猜到的是编译器将此表达式等同于以下内容:
byte d = 11;
并且不认为这是一个表达式。
回答一
是的,它确实。
只要右侧表达式由常量组成(适合所需的基本类型,请参阅@Jason的答案以了解JLS对此的确切说法),
就可以做到这一点。由于128超出范围,
因此无法编译:
byte a = 128;
请注意,如果您像这样转换第一个代码段:
final byte a = 3;
final byte b = 8;
byte c = a + b;
它编译!因为这两个字节是它们的表达式,final 并且它们的表达式是常量,所以这次,编译器可以确定结果在首次初始化时将适合一个字节。
但是,这将无法编译:
final byte a = 127; // Byte.MAX_VALUE
final byte b = 1;
byte c = a + b // Nope...
编译器将错误提示“可能丢失精度”。
回答二
这是因为3和8是编译时间常数。
因此,在发生编译时,编译器可以识别出3 + 8可以适合byte变量的变量。
如果您将您的变量a和b最终变量(常数)设置为常数。a + b将成为一个编译时间常数。
因此,它将毫无问题地进行编译。
final byte a = 3;
final byte b = 8;
byte c = a + b;
文章翻译自Stack Overflow :stackoverflow.com/questions/1…