为什么不能在某些情况下添加int和char?

为什么

char ch = '4'; ch = '4' + 2; 

工作,但是

 char ch = '4'; ch = ch + 2; 

不?

为了理解这一点,让我们考虑编译器在每个步骤中所做的两种可能性。 让我们从开始:

 ch = '4' + 2; 

编译器将“4”转换为int。 所以它成为

 ch = 52 + 2; 

编译器然后变成

 ch = 54; 

ch是一个char,编译器可以将54转换为char,因为它可以certificate转换没有任何损失。

现在让我们考虑第二个版本:

 ch = ch + 2; 

ch在编译时没有已知的值。 这样就变成了

 ch = ((int) ch) + 2; 

现在编译器不能certificate这个(一个int)的结果是存储在一个字符的范围内。 所以它不会自动缩小它,并将其报告为错误。

EDIT1:

如果编译器可以certificatevariables永远不会改变,并且是可以嵌套的。 然后第二种forms可以变成第一种。 Subir指出,增加“最终”使这成为可能。 虽然如果编译器要执行变更分析,那么它在技术上能够在没有最终关键字的情况下计算出来,但是最终确实使代码的编译器和读取器更容易。

EDIT2:

Java语言规范涵盖了将int缩小到char的问题,链接由Jon Skeet友好提供。