我一直在测试char铸件,我经历了这个:
public class Test {
public static void main(String a[]) {
final byte b1 = 1;
byte b2 = 1;
char c = 2;
c = b1; // 1- Working fine
c = b2; // 2 -Compilation error
}
}
有人解释为什么当我在字节中添加最后一个时它能正常工作吗?
答案 0 :(得分:19)
当变量为final
时,编译器会自动内联其值为1.此值可表示为char
,即:
c = b1;
相当于
c = 1;
事实上,根据this section on final
variables,b1
被视为常数:
基本类型或类型
String
的变量,即final
,并使用编译时常量表达式(第15.28节)初始化,称为常量变量。
答案 1 :(得分:10)
从byte
到char
的转换是一种扩展和缩小的原始转换,如Java语言规范的paragraph 5.1.4中所述。
正如JLS所描述的,这是通过中间步骤完成的; byte
通过扩展原语转换转换为int
,然后int
通过缩小原语转换转换为char
。(请参阅5.1.3)。< / p>
Paragraph 5.2说明在执行作业时何时需要演员:
...如果表达式是{strong}
byte
,short
,char
或{{ 1}}:
- 如果变量的类型是
int
,byte
或short
,则可以使用缩小的基元转换,并且常量表达式的值可以在类型中表示。变量
您的变量char
确实是常量,但您的变量b1
不是,因此此规则适用于b2
,但不适用于b1
。
所以:您可以将b2
分配给b1
,因为c
是一个常量,而常量b1
的值适合1
,但是如果没有强制转换,您就无法将char
分配给b2
,因为c
不是常量。
答案 2 :(得分:0)
好吧,因为byte是签名类型而char不是,所以你需要为(2)
应用显式类型转换c = (char)b2;
最终声明也适用于1,因为在编译之前,编译器能够确认没有因转换而丢失,因为'1'在char范围内,尝试将'-1'放在同一个final中(1)中的陈述您将再次收到编译错误。
所有这些归结为有符号和无符号类型之间的类型兼容性......这需要在java中明确地完成。