Neden ArrayLists bir dizi yapmaya çalıştığınızda: ArrayList<Integer>[] arr=new ArrayList<Integer>[40];
bir hata var ve java buna izin vermiyor?
Java'nın jenerik, herhangi bir dilde jenerik veya keyfi bir şey uygulamasıyla ilgili bir sebep var mı?
Neden ArrayLists bir dizi yapmaya çalıştığınızda: ArrayList<Integer>[] arr=new ArrayList<Integer>[40];
bir hata var ve java buna izin vermiyor?
Java'nın jenerik, herhangi bir dilde jenerik veya keyfi bir şey uygulamasıyla ilgili bir sebep var mı?
Yanıtlar:
Bu Java'nın jenerik önemli deliklerin biridir dizilerdir bildirdiğinden türde bir dizi, yani Foo[]
bir alt sınıfıdır Object[]
ve ParentOfFoo[]
. Kontrast bununla List<Foo>
hangi bu davranışı yok.
Java jeneriklere sahip olmadığında (Java 5'e kadar) bu önemliydi, çünkü aksi halde, genel bir sıralama işlevi gibi bir şey imkansızdı.
Ancak dizilerin çalışma zamanında ne tür olduklarını bilmek gibi zor bir sorunu var . Ancak Java'daki jenerikler tür silinmesine dayanır. Bu iki şey hiç iyi bir şekilde örtüşmüyor ve sorunumuzu buradan alıyoruz.
Yani uzun ve kısa, Java 1'de, kovaryant diziler jenerik eksikliğin yarattığı deliği kısmen doldurdu. Bununla birlikte, bu deliği düzgün bir şekilde doldurmaya çalıştıklarında, geriye dönük uyumluluk dizilerin uygulanması oldukça imkansız olduğu anlamına geliyordu.
Aslında, aslında jenerikler için bir çerçeve oluşturan Martin Odersky, Scala'yı neden yaptığı hakkında bir röportaj sırasında burada konuştu . (Scala'nın tarihiyle hiç ilgileniyorsanız oldukça büyüleyici)
Java'nın jenerik, herhangi bir dilde jenerik veya keyfi bir şey uygulamasıyla ilgili bir sebep var mı?
Aslında biraz keyfi.
Sorun, ArrayList<T>[]
döküm sisteminde olabilir Object[]
ve daha sonra ArrayList<U>
dizide bir nereye koyabilirsiniz , çünkü tip sisteminde bir delik izin olmasıdır U != T
.
Java tasarımcıları bu deliğe izin vermeyerek mümkün olduğunca hevesle engellemeye karar verdiler new ArrayList<T>[N]
.
Bununla birlikte, jenerik dizilerinin yayınlanmasına izin verilmemesi de ("kontrol edilmemiş" uyarısı olmadan) takılmış olabilir.
Integer
Object[]
String[]
çünkü dizi, her türün nesnenin bir alt sınıfı olduğu kovaryant olduğundan, döküm istisnası nedeniyle çalışma zamanında bir hata verir. ederken jenerik değişmez olduğu bu tip üzerine inşa yüzden ne zaman sağlamak veya tip-güvenli yüzden bir derleyici hata veriyor tip oluşturur değil gibi tipi eğer.