Java SE 6 ve Java SE 7 arasında otomatik kutudan çıkarma davranışında bir fark olduğunu fark ettim. Bunun neden olduğunu merak ediyorum, çünkü bu iki sürüm arasında bu davranışta herhangi bir değişiklik belgesi bulamıyorum.
İşte basit bir örnek:
Object[] objs = new Object[2];
objs[0] = new Integer(5);
int myInt = (int)objs[0];
Bu, Java SE 7'den javac ile iyi derlenir. Ancak, derleyiciye "-source 1.6" argümanını verirsem, son satırda bir hata alıyorum:
inconvertible types
found : java.lang.Object
required: int
Yerel sürüm 6 derleyicisiyle derlemek için Java SE 6'yı indirmeyi denedim (kaynak seçeneği olmadan). Yukarıdakiyle aynı hatayı kabul eder ve verir.
Peki ne verir? Daha fazla deneyden, Java 6'daki kutudan çıkarmanın yalnızca kutulu tipte olduğu açıkça (derleme zamanında) olan değerleri açabileceği görülmektedir. Örneğin, bu her iki sürümde de çalışır:
Integer[] objs = new Integer[2];
objs[0] = new Integer(5);
int myInt = (int)objs[0];
Öyleyse, Java 6 ve 7 arasında, kutudan çıkarma özelliği, değerin uygun kutulu tipte olduğunu bilmeden (derleme zamanında) tek seferde nesne türlerini çevirip kutudan çıkarabilecek şekilde geliştirildi. Bununla birlikte, Java Dil Spesifikasyonunu veya Java 7 çıktığında yazılan blog gönderilerini okurken, bu şeyde herhangi bir değişiklik göremiyorum, bu yüzden değişikliğin ne olduğunu ve bu "özelliğin" ne olduğunu merak ediyorum ?
Sadece bir merak: Değişiklik nedeniyle, "yanlış" kutudan çıkarmaları tetiklemek mümkündür:
Object[] objs = new Float[2];
objs[0] = new Float(5);
int myInt = (int)objs[0];
Bu iyi derler ancak çalışma zamanında bir ClassCastException verir.
Bununla ilgili herhangi bir referans var mı?
Integer obj = new Integer(2); int x = (int)obj;
: Java 7'de çalışıyor, Java 6'da hata veriyor.