原因是JLS#5.2(分配转换)如此表示:
如果该表达式是类型为byte,short,char或int的常量表达式(第15.28节),则当变量的类型为byte,short或char且常量表达式的值时,可以使用缩小的原始转换。用变量的类型表示。
在您的示例中,
char c ='c';不是一个常数,而是一个常数
finalchar c = 'c';。
基本原理可能是加法运算符
+首先将其操作数转换为整数。因此,除非一切都恒定,否则该操作可能会溢出,在这种情况下,编译器可以证明没有溢出。

原因是JLS#5.2(分配转换)如此表示:
如果该表达式是类型为byte,short,char或int的常量表达式(第15.28节),则当变量的类型为byte,short或char且常量表达式的值时,可以使用缩小的原始转换。用变量的类型表示。
在您的示例中,
char c ='c';不是一个常数,而是一个常数
finalchar c = 'c';。
基本原理可能是加法运算符
+首先将其操作数转换为整数。因此,除非一切都恒定,否则该操作可能会溢出,在这种情况下,编译器可以证明没有溢出。