2017-09-13 59 views

Trả lời

16

Từ JLS Sec 5.2, "Assignment contexts" (tôi nhấn mạnh):

Bên cạnh đó, nếu biểu thức là một biểu thức hằng số (§15.28) kiểu byte, short, char, int hoặc:

  • Một chuyển đổi nguyên thủy thu hẹp có thể được sử dụng nếu loại biến là byte, ngắn hoặc char và giá trị của biểu thức hằng số là biểu thị trong loại biến.
  • Chuyển đổi nguyên thủy thu hẹp theo sau là một chuyển đổi quyền anh có thể được sử dụng nếu kiểu của biến là:

    • Byte và giá trị của biểu thức liên tục được biểu diễn trong các loại byte.
    • ...

Nó chỉ đơn giản là không được phép cho long s bởi spec.

Lưu ý rằng điểm viên đạn thứ hai ở đây nói rằng điều này xảy ra không phụ thuộc vào đấm bốc: gán một long biểu thức hằng số cho một biến byte tương tự sẽ thất bại:

// Both compiler errors. 
byte primitive = 0L; 
Byte wrapped = 0L; 
+0

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? –

+6

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

+0

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

Các vấn đề liên quan