b6 không hoạt động do biên dịch thời gian thu thập các hằng số theo nghĩa đen. b7 không làm việc vì thời gian biên dịch thu hẹp được giới hạn cho tất cả nguyên thủy nhưng dài (loại kỳ lạ, không biết tại sao)
Phần thú vị là §5.2 of the JLS:
In addition, if the expression is a constant expression (§15.28) of type byte, short, char or int :
A narrowing primitive conversion may be used if the type of the variable is byte, short, or char, and the value of the constant expression is representable in the type of the variable.
A narrowing primitive conversion followed by a boxing conversion may be used if the type of the variable is :
- Byte and the value of the constant expression is representable in the
type byte.
- Short and the value of the constant expression is representable in
the type short.
- Character and the value of the constant expression is representable in the type char.
If the type of the expression cannot be converted to the type of the variable by a conversion permitted in an assignment context, then a compile-time error occurs.
Không có ý tưởng tại sao i
không hoạt động mặc dù - mở rộng sẽ hoạt động tốt và trên thực tế, trình biên dịch sẽ tạo ra một cái gì đó giống như Integer.valueOf((byte)3);
dù sao đi nữa. Sử dụng cuộc gọi rõ ràng hoạt động như mong đợi, tức là việc mở rộng đang diễn ra.
Khá thú vị khi sử dụng trình biên dịch Java nhật thực Integer i = (byte) 3;
biên dịch tốt, dẫn tôi tin rằng bạn vừa tìm thấy lỗi trong javac - xin chúc mừng! (cũng là một trong hai hoặc một lỗi trong trình biên dịch eclipse, nhưng hành vi của nhật thực có vẻ đúng với tôi). FWIW Tôi đã báo cáo lỗi chống javac đến oracle ..
Tìm phần bên phải trong JLS ít hoạt động hơn định dạng mà nó có thể đọc được - vì vậy có thể dễ dàng hơn nếu bạn theo liên kết để thay thế.
Nếu không có thông báo lỗi và số dòng của khiếu nại, điều này khá khó trả lời. – bmargulies
Ngoài ra, 'byte x = 126 + 1;' hoạt động nhưng không phải 'byte y = 126 + 2;' Bằng cách nào đó, khi sử dụng giá trị có thể tính toán, trình biên dịch sẽ kiểm tra xem vùng chứa có đủ rộng không. Tuy nhiên, không thể tìm thấy ref trong JLS. – gawi
Điều này được thảo luận theo chiều dài trong câu trả lời cho câu hỏi này: [link] (http://stackoverflow.com/questions/81392/java-why-do-i-receive-the-error-message-type-mismatch-cannot -convert-int-to-b) –