Chr*_*s K 62

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

ch = '4' + 2;
Run Code Online (Sandbox Code Playgroud)

编译器将'4'转换为int.所以它变成了

ch = 52 + 2;
Run Code Online (Sandbox Code Playgroud)

然后编译器变成了什么

ch = 54;
Run Code Online (Sandbox Code Playgroud)

ch是一个char,允许编译器将54转换为char,因为它可以证明转换没有丢失.

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

ch = ch  + 2;
Run Code Online (Sandbox Code Playgroud)

ch在编译时没有已知值.这就变成了

ch = ((int) ch) + 2;
Run Code Online (Sandbox Code Playgroud)

现在编译器无法证明这个(int)的结果可以存储在char的范围内.所以它不会自动缩小它,并将其报告为错误.

EDIT1:

如果编译器可以证明变量永远不会改变,并且是可内联的.然后第二种形式可以变成第一种形式.Subir指出,添加'final'使这成为可能.虽然如果编译器要执行更改分析,那么它在技术上能够在没有final关键字的情况下解决这个问题,但是final确实使编译器和代码的读者更容易.

EDIT2:

Java语言规范中涵盖了将int缩小为char ,该链接由Jon Skeet友情提供.

  • @Lester因语言设计者认为某个字符溢出是一个明显的案例缺陷; 并且在编译时他们可以检测到这种情况.请注意,对于整数而言并非如此. (2认同)