以下代码段发出编译时错误.
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可以安全地从执行收缩转换int到char.
如果相反,你有
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.
| 归档时间: |
|
| 查看次数: |
3754 次 |
| 最近记录: |