Bagaimana Java ditingkatkan sehingga tidak perlu lagi melakukan penghapusan tipe?

16

The resmi tutorial Java pada obat generik menjelaskan penghapusan jenis dan mengapa hal itu ditambahkan ke compiler:

Ketika tipe generik dipakai, kompiler menerjemahkan tipe-tipe tersebut dengan teknik yang disebut tipe erasure - suatu proses di mana kompiler menghapus semua informasi yang terkait dengan parameter tipe dan argumen tipe dalam kelas atau metode. Penghapusan jenis memungkinkan aplikasi Java yang menggunakan obat generik untuk mempertahankan kompatibilitas biner dengan perpustakaan Java dan aplikasi yang dibuat sebelum obat generik.

Kemungkinan besar ini adalah pendekatan pragmatis, atau mungkin yang paling tidak menyakitkan. Namun, sekarang karena obat generik didukung secara luas di seluruh industri, apa yang dapat dilakukan agar kita tidak perlu menghapus jenis? Apakah layak tanpa perlu merusak kompatibilitas, atau jika layak, apakah praktis?

Apakah pernyataan terakhir dalam kutipan di atas menjadi referensi diri? Yaitu: "tipe erasure memungkinkan aplikasi Java yang menggunakan generik untuk mempertahankan kompatibilitas biner dengan perpustakaan Java dan aplikasi yang dibuat dengan versi Java yang melakukan penghapusan tipe."

pengguna
sumber
1
The Sun 1.4 telah DIMULAI. IBM masih mendukung 1.4 pada platform mereka.
@ ThorbjørnRavnAndersen: Dan setidaknya untuk platform yang berada di ruang bawah tanah ayah saya, tidak ada 1.5.
Jörg W Mittag
@ ThorbjørnRavnAndersen Tidak hanya itu tetapi seseorang dapat membeli dukungan tambahan untuk versi JVM yang lebih lama juga. Terakhir saya dengar meskipun itu cukup mahal.
maple_shaft
1
Tak satu pun dari kita di sini memiliki bola kristal, jadi, itu tidak bisa dijawab. Mungkin itu dapat dibuka kembali jika Anda mengulangi pertanyaan dari pertanyaan "Akankah ada ..." menjadi "Apa yang perlu dilakukan untuk Penghapusan Jenis yang akan dilakukan dalam versi masa depan Jawa"
maple_shaft
@ JörgWMittag apakah itu platform yang benar-benar digunakan untuk produksi pada 2012?

Jawaban:

7

Akhir masa berlaku untuk Java Development Toolkit dan Java Runtime Environment. Dan hanya versi Oracle (Sun). Tetapi itu tidak berlaku untuk aplikasi yang ditulis oleh pihak ketiga. Tujuannya adalah untuk tidak pernah memecahkan kode yang pernah berjalan di JVM, sehingga kemungkinan besar Java tidak akan pernah berhenti melakukan penghapusan tipe.

Tentu saja C # juga memperkenalkan generik dalam versi yang lebih baru dengan cara yang kompatibel tanpa melakukan penghapusan tipe, tetapi pada dasarnya berarti menduplikasi semua kelas koleksi. Yang saya kira adalah apa yang tidak ingin dilakukan oleh perancang Java dan oleh karena itu mengapa mereka memilih jenis penghapusan di tempat pertama. Tanpa tipe nilai keuntungan dari generik yang tidak terhapus tipe tidak sebesar itu.

Jan Hudec
sumber
6
Tim OpenJDK telah membahas melihat Generics reified lagi, jangka waktu? Kemungkinan besar akan dilihat secara serius selama jangka waktu Java 9 dan jika secara teknis layak, disampaikan dalam jangka waktu Java 10. Tetapi ini adalah peramal yang serius di pihak saya.
Martijn Verburg
Penghapusan tipe dilakukan oleh kompiler, bukan JVM. Memperkenalkan reified generics akan membutuhkan kompiler baru dan JVM baru, tetapi mungkin mereka masih bekerja dengan kode lama.
Gabe
@ Gabe: Jelas mereka akan diperkenalkan dalam rilis baru, jadi akan ada kompiler baru dan JVM baru. Tetapi juga membutuhkan duplikasi bagian penting dari pustaka standar, karena itu akan memerlukan versi generik untuk kode baru dan versi non-generik untuk kompatibilitas ke belakang. .NET melakukan hal itu di versi 2.0, Java menghindarinya dengan penghapusan. .NET memiliki tipe nilai (struct) dan dukungan kelas satu untuk mereka menghalangi penghapusan tipe. Java tidak, jadi tekanan untuk obat generik jauh lebih kecil.
Jan Hudec
Jan: Saya baru saja mengomentari fakta bahwa reifying generics tidak secara otomatis berarti semua kode lama rusak. Saya juga akan menambahkan bahwa List<int>mungkin akan membuat beban kerja yang jauh lebih efisien daripada saat ini List<Integer>.
Gabe
@ Gabe: Kami tidak setuju dalam hal itu. Saya hanya ingin mencatat kelemahan utama.
Jan Hudec