Java jenerikleri neden dizilerde olamaz?


Yanıtlar:


20

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)


3

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.


Bu cevabın önemsiz olduğu anlaşılıyor. Çok basit ve belirsiz terimlerle jargon kullanmıyor. Çok teşekkürler.
Tung Nguyen

Bunun neden aslında birIntegerObject[]String[]
Caleth

-3

çü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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.