为什么
char ch = '4';
ch = '4' + 2;
工作,但
char ch = '4';
ch = ch + 2;
不
答案 0 :(得分:62)
为了理解这一点,让我们考虑编译器在两个可能性的每个步骤中所做的事情。让我们从:
开始ch = '4' + 2;
编译器将'4'转换为int。所以它变成
ch = 52 + 2;
然后编译器变为
ch = 54;
ch是一个char,允许编译器将54转换为char,因为它可以证明转换没有丢失。
现在让我们考虑第二个版本:
ch = ch + 2;
ch在编译时没有已知值。这就变成了
ch = ((int) ch) + 2;
现在编译器无法证明this(一个int)的结果可以存储在char的范围内。因此不会自动缩小范围,并将其报告为错误。
EDIT1:
如果编译器可以证明变量永远不会改变,并且是可以内联的。然后第二种形式可以变成第一种形式。 Subir指出,添加'final'使这成为可能。虽然如果编译器要执行更改分析,那么它在技术上能够在没有final关键字的情况下解决这个问题,但是final确实使编译器和代码的读者更容易。
EDIT2:
Java Language Spec涵盖了将int缩小为char的情况,该链接由Jon Skeet友情提供。