Không có lỗi trong quá trình tự động sửa đổi các hằng số với các loại int
và short
tới Byte
, nhưng không đổi với long
loại có lỗi. Tại sao?Tại sao trong quá trình autoboxing cuối cùng dài để Byte biên dịch lỗi xảy ra, nhưng cuối cùng int để Byte là ok?
final int i = 3;
Byte b = i; // no error
final short s = 3;
Byte b = s; // no error
final long l = 3;
Byte b = l; // error
Tôi tò mò muốn tìm hiểu tại sao. Nó có thể liên quan đến thực tế rằng từ lâu là từ máy? –
Có lẽ chủ yếu là vì 'int' là kiểu mặc định cho các giá trị không đổi, bao gồm các biểu thức, vì vậy sẽ có một _lot_ của mã như' short s = 123' và nếu chuyển đổi thu hẹp không được sử dụng, bạn cần phôi ở khắp mọi nơi . Đặc biệt, Java không có cú pháp cho các loại chữ hẹp hơn. Mặt khác, nếu kiểu biểu thức rõ ràng là 'long', vì' L' đã được sử dụng trên hằng số hoặc một phần nào đó là hằng số, thì có thể là lỗi để thu hẹp nó, và tình huống này ít phổ biến hơn so với trường hợp 'int' và tôi đoán số dư rơi vào lợi thế khiến nó trở thành lỗi. – BeeOnRope
Cũng lưu ý rằng hộp số tự động thực sự không có nhiều việc phải làm với điều này: điều tương tự cũng áp dụng cho các kiểu thuần túy nguyên thủy. Các quy tắc đã được mở rộng để bao gồm chuyển nhượng cho các loại đóng hộp khi chúng được thêm vào. @JonathanRosenne – BeeOnRope