Tôi đã nhận thấy sự khác biệt về hành vi tự động mở hộp giữa Java SE 6 và Java SE 7. Tôi tự hỏi tại sao lại như vậy, vì tôi không thể tìm thấy bất kỳ tài liệu nào về những thay đổi trong hành vi này giữa hai phiên bản này.
Đây là một ví dụ đơn giản:
Object[] objs = new Object[2];
objs[0] = new Integer(5);
int myInt = (int)objs[0];
Điều này biên dịch tốt với javac từ Java SE 7. Tuy nhiên, nếu tôi cung cấp cho trình biên dịch đối số "-source 1.6", tôi sẽ gặp lỗi ở dòng cuối cùng:
inconvertible types
found : java.lang.Object
required: int
Tôi đã thử tải xuống Java SE 6 để biên dịch với trình biên dịch phiên bản gốc 6 (không có bất kỳ tùy chọn -source nào). Nó đồng ý và đưa ra lỗi tương tự như trên.
Vì vậy, những gì cho? Từ một số thử nghiệm khác, có vẻ như việc mở hộp trong Java 6 chỉ có thể mở hộp các giá trị rõ ràng (tại thời điểm biên dịch) thuộc loại được đóng hộp. Ví dụ: điều này hoạt động trong cả hai phiên bản:
Integer[] objs = new Integer[2];
objs[0] = new Integer(5);
int myInt = (int)objs[0];
Vì vậy, có vẻ như giữa Java 6 và 7, tính năng mở hộp đã được cải tiến để nó có thể ép và mở hộp các loại đối tượng trong một lần chuyển mà không cần biết (tại thời điểm biên dịch) rằng giá trị có thuộc loại được đóng hộp thích hợp hay không. Tuy nhiên, đọc qua Đặc tả ngôn ngữ Java hoặc các bài đăng trên blog được viết vào thời điểm Java 7 ra mắt, tôi không thể thấy bất kỳ thay đổi nào của điều này, vì vậy tôi tự hỏi thay đổi là gì và "tính năng" này được gọi là gì ?
Chỉ là sự tò mò: Do sự thay đổi, có thể kích hoạt các hộp mở "sai":
Object[] objs = new Float[2];
objs[0] = new Float(5);
int myInt = (int)objs[0];
Điều này biên dịch tốt nhưng cung cấp một ClassCastException trong thời gian chạy.
Bất kỳ tài liệu tham khảo về điều này?
Integer obj = new Integer(2); int x = (int)obj;
: Công trình trên Java 7, mang đến cho lỗi trên Java 6.