ฉันสังเกตเห็นความแตกต่างของพฤติกรรมการแกะกล่องอัตโนมัติระหว่าง Java SE 6 และ Java SE 7 ฉันสงสัยว่าทำไมถึงเป็นเช่นนั้นเพราะฉันไม่พบเอกสารการเปลี่ยนแปลงใด ๆ ในพฤติกรรมนี้ระหว่างสองเวอร์ชันนี้
นี่คือตัวอย่างง่ายๆ:
Object[] objs = new Object[2];
objs[0] = new Integer(5);
int myInt = (int)objs[0];
สิ่งนี้รวบรวมได้ดีกับ javac จาก Java SE 7 อย่างไรก็ตามหากฉันให้อาร์กิวเมนต์ "-source 1.6" แก่คอมไพเลอร์ฉันได้รับข้อผิดพลาดในบรรทัดสุดท้าย:
inconvertible types
found : java.lang.Object
required: int
ฉันลองดาวน์โหลด Java SE 6 เพื่อคอมไพล์กับคอมไพเลอร์เวอร์ชัน 6 ดั้งเดิม (ไม่มีตัวเลือก -source ใด ๆ ) ตกลงและให้ข้อผิดพลาดเช่นเดียวกับด้านบน
ให้อะไร? จากการทดลองเพิ่มเติมดูเหมือนว่าการ unboxing ใน Java 6 จะสามารถ unbox ได้เฉพาะค่าที่ชัดเจน (ในเวลาคอมไพล์) เท่านั้นที่เป็นชนิดบรรจุกล่อง ตัวอย่างเช่นสิ่งนี้ใช้ได้ทั้งสองเวอร์ชัน:
Integer[] objs = new Integer[2];
objs[0] = new Integer(5);
int myInt = (int)objs[0];
ดังนั้นดูเหมือนว่าระหว่าง Java 6 และ 7 คุณสมบัติการแกะกล่องได้รับการปรับปรุงเพื่อให้สามารถแคสต์และคลายประเภทอ็อบเจ็กต์ได้ในคราวเดียวโดยไม่รู้ (ในเวลาคอมไพล์) ว่าค่าอยู่ในประเภทกล่องที่เหมาะสม อย่างไรก็ตามเมื่ออ่านข้อกำหนดภาษา Java หรือบล็อกโพสต์ที่เขียนขึ้นในตอนที่ Java 7 ออกมาฉันไม่เห็นการเปลี่ยนแปลงใด ๆ ของสิ่งนี้ฉันจึงสงสัยว่าการเปลี่ยนแปลงคืออะไรและ "คุณลักษณะ" นี้เรียกว่าอะไร เหรอ?
เพียงแค่อยากรู้: เนื่องจากการเปลี่ยนแปลงนี้เป็นไปได้ที่จะทำให้เกิดการแกะกล่อง "ผิด":
Object[] objs = new Float[2];
objs[0] = new Float(5);
int myInt = (int)objs[0];
สิ่งนี้รวบรวมได้ดี แต่ให้ ClassCastException ที่รันไทม์
การอ้างอิงใด ๆ เกี่ยวกับเรื่องนี้?
Integer obj = new Integer(2); int x = (int)obj;
: ทำงานบน Java 7 ให้ข้อผิดพลาดบน Java 6