这里有一些语句, 其中错误的都注释掉了,都是类型错, 求解为什么?
例如第一处注释
这边X是int型, b1是byte型, 无法赋值
它下一行Y是int型, b2是byte型, 赋值成功
是否和编译过程有关?
int a = 1;
final int X = a;
final int Y = 10;
//byte b1 = X;
byte b2 = Y;
byte b3 = Y + 1;
//byte b4 = (4 < 5)? X : 4;
byte b5 = (4 < 5)? Y : 4;
byte b6 = 12;
byte b7 = (4 < 5)? b6 : 4;
//byte b8 = b6 + 4;
byte b9 = (4 < 5)? b6 : ('3' + 1);
//byte b10 = (4 < 5)? b6 : '3';
char ch1 = 'A';
char ch2 = (4 < 5)? ch1 : (4 + 1);
//char ch3 = (4 < 5)? 'A' : b6;
//short s = (4 < 5)? 'A' : b6;
具体分析了一下原因是,你的X的赋值是通过变量int a来完成的,编译器无法确定a的值是否在byte数据类型的范围内,所以编译器会报错Type mismatch: cannot convert from int to byte。所以需要自己强制转换
而byte b2=Y之所以能成功是因为Y的值是常量10,在byte数据范围内,编译器会自动完成int-byte的转换的,反编译可以看到这行是bipush 10,自动将int转换成byte并入栈。这个编译器会自动识别并完成类型转换的。
但是如果你修改下Y的值成200的话,同样还是会报跟X一样的错误。所以这个问题的根源是编译器对byte和int自动转换的处理方式。
你的x是字母,y是数字,肯定不一样啊
int和byte是两种不同的数据类型,如果你一定要这么赋值的话就需要强制转换,改成这样就可以了:byte b1=(byte) X;