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
不是常量表达式,所以编译器无法确定作为int
的c + 5
的值是否能够适合char
。
在这
final char c = 'c'; char d = c + 5;
其中c
是常量表达式,编译器可以确定将c
的值( 99
)添加到5
,即104
确实适合char
。 由于这种保证,Java可以安全地执行从int
到char
的缩小转换。
相反,你有
final char a = Character.MAX_VALUE; char b = (a + 5);
您会看到与第一个测试用例类似的行为,因为a + 5
的值不适合char
。 编译器确定由a + 5
产生的int
值不适合char
。