我尝试了很多重新纠正此代码。但是我找不到为什么它是非法的。请解释理论上的错误是什么?
class Example{
public static void main(String args[]){
final int y;
y=100;
byte b;
b=y;
}
}
我猜你是在问为什么该代码给了你
Example.java:6:错误:不兼容的类型:从int到字节的可能有损转换
b=y; ^
但是此代码不:
class Example{
public static void main(String args[]){
final int y=100; // <=======
byte b;
b=y;
}
}
原因是,如果您不提供该值作为初始值设定项(稍后通过赋值来分配它),则编译器不会将其视为编译时常量,因此也不知道该值将适合byte
。在某种程度上,这是因为要将其视为编译时常量,编译器将不得不处理您执行此操作的可能性:
class Example{
public static void main(String args[]){
final int y;
if (Math.random() < 0.5) {
y=100;
} else {
y=1000;
}
byte b;
b=y;
}
}
因此,编译器仅在将其作为初始化程序时才将100
作为编译时常量处理,而在将其作为赋值时则不会处理。