1.31 Java中的原始转换和赋值| Java Debug 笔记

118 阅读2分钟

本文正在参加「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...

编译器将错误提示“可能丢失精度”。

回答二

这是因为38是编译时间常数。

因此,在发生编译时,编译器可以识别出3 + 8可以适合byte变量的变量。

如果您将您的变量ab最终变量(常数)设置为常数。a + b将成为一个编译时间常数。

因此,它将毫无问题地进行编译。

  final byte a = 3;
    final byte b = 8;
    byte c = a + b;

文章翻译自Stack Overflow :stackoverflow.com/questions/1…