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

时间:2014-07-07 10:16:51

标签: java

为什么

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

工作,但

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

1 个答案:

答案 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友情提供。