Java中的最终字符

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

char c = 'c'; char d = c + 5; 

第二行的错误说,

 possible loss of precision required: char found: int 

该错误消息基于NetBeans IDE。


当这个字符c被声明为final ,如下所示。

 final char c = 'c'; char d = c + 5; 

编译器时间错误消失了。

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

final修饰符在这里有什么不同?

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

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

在您的示例中, char c = 'c'; 不是常数,而是final char c = 'c'; 是。

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

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

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

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

这里

 char c = 'c'; char d = c + 5; 

因为c不是常量表达式,所以编译器无法确定作为intc + 5的值是否能够适合char

在这

 final char c = 'c'; char d = c + 5; 

其中c是常量表达式,编译器可以确定将c的值( 99 )添加到5 ,即104确实适合char由于这种保证,Java可以安全地执行从intchar的缩小转换。

相反,你有

 final char a = Character.MAX_VALUE; char b = (a + 5); 

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