Java中的最终字符

Tin*_*iny 27 java final char

以下代码段发出编译时错误.

char c = 'c';
char d = c + 5;
Run Code Online (Sandbox Code Playgroud)

第二行的错误说,

possible loss of precision
  required: char
  found:    int
Run Code Online (Sandbox Code Playgroud)

该错误消息基于NetBeans IDE.


当此字符c声明final如下时.

final char c = 'c';
char d = c + 5;
Run Code Online (Sandbox Code Playgroud)

编译器时间错误消失了.

它与最终字符串的情况无关

什么是final修改有所作为吗?

ass*_*ias 24

原因是JLS#5.2(分配转换)如此说:

如果表达式是byte,short,char或int类型的常量表达式(第15.28节),如果变量的类型是byte,short或char,则可以使用缩小的原语转换,以及常量表达式的值可表示变量的类型.

在你的例子中,char c = 'c';不是常数而是final char c = 'c';.

基本原理可能是加法运算符+首先将其操作数转换为整数.所以操作可能会溢出,除非一切都是常量,在这种情况下编译器可以证明没有溢出.


Sot*_*lis 15

+运算符应用于整数类型时

对操作数执行二进制数字提升(第5.6.2节).

在这种情况下,char值将提升为int值.

这里

char c = 'c';
char d = c + 5;
Run Code Online (Sandbox Code Playgroud)

因为c不是常量表达式,编译器无法确定c + 5其中的值int是否能够适合a char.

在这

final char c = 'c';
char d = c + 5;
Run Code Online (Sandbox Code Playgroud)

其中c是一个常量表达式,编译器确定的值c,这是99,添加到5,这是104不配合在char.由于本次担保,Java可以安全地从执行收缩转换intchar.

如果相反,你有

final char a = Character.MAX_VALUE;     
char b = (a + 5);
Run Code Online (Sandbox Code Playgroud)

你会看到与你的第一个测试用例相似的行为,因为它的值a + 5不适合a char.编译器确定int由此产生的值a + 5不适合a char.

  • 在恕我直言中+1更好的解释. (3认同)

归档时间:

查看次数:

3754 次

最近记录:

11 年,8 月 前