Câu trả lời là trong JLS - 5.2. Assignment Conversion:
.. nếu biểu thức là một biểu thức hằng số (§15.28) kiểu byte
, short
, char
, hoặc int
:
- Một thu hẹp nguyên thủy chuyển đổi có thể được sử dụng nếu loại biến là
byte
, short
hoặc char
và giá trị của biểu thức hằng số là biểu thị trong loại biến.
Khi bạn viết:
final short s1 = 1;
Giá trị của biểu thức là biết tại thời gian biên dịch, và vì nó không thể thay đổi bạn không cần phải cast.
Trong đoạn mã thứ hai của bạn, giá trị không được biết tại thời gian biên dịch - được đánh giá trong thời gian thời gian chạy, vì vậy bạn sẽ cần một dàn diễn viên rõ ràng.
Nếu bạn cố gắng để biên dịch đoạn mã sau:
final byte b1 = 200;
final byte b2 = 200;
byte sum = b1 + b1;
Bạn sẽ nhận được một biên soạn lỗi từ các giá trị ở phía bên phải là biết để trình biên dịch và nó biết rằng tổng không thể khớp với số byte
.
Trình biên dịch của bạn nói gì? – Idos
Loại không phù hợp: không thể chuyển đổi từ ngắn thành byte – MATH000
@balalaika Tôi đoán anh ấy hiểu rằng anh ấy có thể truyền. Ông hỏi tại sao 4 dòng đầu tiên không gây ra vấn đề cho trình biên dịch. – GhostCat