Saya telah mencatat perbedaan dalam perilaku unboxing otomatis antara Java SE 6 dan Java SE 7. Saya bertanya-tanya mengapa demikian, karena saya tidak dapat menemukan dokumentasi apa pun tentang perubahan perilaku ini antara kedua versi ini.
Berikut contoh sederhananya:
Object[] objs = new Object[2];
objs[0] = new Integer(5);
int myInt = (int)objs[0];
Ini mengkompilasi dengan baik dengan javac dari Java SE 7. Namun, jika saya memberikan kompilator argumen "-source 1.6" saya mendapatkan kesalahan pada baris terakhir:
inconvertible types
found : java.lang.Object
required: int
Saya mencoba mengunduh Java SE 6 untuk dikompilasi dengan kompiler versi 6 asli (tanpa opsi -sumber). Itu setuju dan memberikan kesalahan yang sama seperti di atas.
Jadi apa yang menyebabkannya? Dari beberapa percobaan lagi terlihat bahwa unboxing di Java 6 hanya dapat membuka nilai-nilai yang jelas (pada waktu kompilasi) adalah tipe kotak. Misalnya, ini berfungsi di kedua versi:
Integer[] objs = new Integer[2];
objs[0] = new Integer(5);
int myInt = (int)objs[0];
Jadi tampaknya antara Java 6 dan 7, fitur unboxing telah ditingkatkan sehingga dapat mentransmisikan dan membuka kotak jenis objek dalam satu gerakan, tanpa mengetahui (pada waktu kompilasi) bahwa nilainya adalah jenis kotak yang sesuai. Namun, membaca Spesifikasi Bahasa Java atau posting blog yang ditulis saat Java 7 keluar, saya tidak dapat melihat perubahan apa pun dari hal ini, jadi saya bertanya-tanya apa perubahannya dan apa "fitur" ini disebut ?
Hanya keingintahuan: Karena perubahan tersebut, mungkin saja memicu unboxing yang "salah":
Object[] objs = new Float[2];
objs[0] = new Float(5);
int myInt = (int)objs[0];
Ini mengkompilasi dengan baik tetapi memberikan ClassCastException pada waktu proses.
Ada referensi tentang ini?
Integer obj = new Integer(2); int x = (int)obj;
: bekerja pada Java 7, memberikan kesalahan pada Java 6.