這裡有一些語句, 其中錯誤的都注釋掉了,都是類型錯, 求解為什麼?
例如第一處注釋
這邊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自動轉換的處理方式。