Nah, motivasi (kompatibilitas ke belakang) adalah keuntungan dan juga kerugian. Ini tidak menguntungkan karena kita semua lebih suka memiliki jenis yang dapat diverifikasi, tetapi harga yang harus dibayar tinggi. Pertimbangkan pilihan desain dalam C #. Mereka memiliki tipe yang dapat diverifikasi, tetapi sekarang mereka memiliki API duplikat. Jadi, bayangkan Java API di mana kami juga memiliki duplikat API untuk setiap kelas parameter. Sekarang, bayangkan diri Anda porting ribuan baris kode dari kelas legacy ke kelas generik baru. Sekarang, siapa yang tidak akan menganggap API rangkap sebagai kerugian? Tapi hei, mereka memiliki tipe yang dapat diverifikasi!
Jadi, motivasi utama adalah "evolusi, bukan revolusi". Dan secara logis, setiap keputusan memiliki tradeoff.
Selain kerugian lain yang disebutkan, kita juga bisa menambahkan fakta bahwa penghapusan tipe dapat menjadi alasan yang sulit pada saat kompilasi, karena tidak jelas bahwa beberapa tipe tertentu akan dihapus, dan ini menyebabkan kesalahan yang sangat aneh dan sulit ditemukan.
Keberadaan metode jembatan (kompiler ini metode yang dihasilkan secara sintaksis untuk menjaga kompatibilitas biner) juga dapat dilihat sebagai kerugian. Dan ini bisa menjadi salah satu alasan kesalahan yang saya sebutkan di paragraf sebelumnya.
Kerugian utama berasal dari fakta yang sudah jelas bahwa ada kelas tunggal dan bukan beberapa kelas untuk tipe generik. Sebagai contoh lain pertimbangkan bahwa overloading metode dengan kelas generik yang sama gagal di Jawa:
public void doSomething(List<One>);
public void doSomething(List<Two>);
Sesuatu yang dapat dilihat sebagai kerugian dari jenis yang dapat diverifikasi (setidaknya dalam C #) adalah fakta bahwa mereka menyebabkan ledakan kode . Sebagai contoh List<int>adalah satu kelas, dan a List<double>adalah kelas yang sama sekali berbeda, karena a List<string>dan a List<MyType>. Jadi kelas harus didefinisikan saat runtime, menyebabkan ledakan kelas dan memakan sumber daya berharga saat sedang dihasilkan.
Mengenai fakta bahwa tidak mungkin untuk mendefinisikan a new T()di Jawa, disebutkan dalam jawaban lain, juga menarik untuk mempertimbangkan bahwa ini bukan hanya masalah penghapusan tipe. Ini juga membutuhkan keberadaan konstruktor default, itu sebabnya C # memerlukan "kendala baru" untuk ini. (Lihat Mengapa T baru () tidak dimungkinkan di Jawa , oleh Alex Buckley).
Ts, Anda hanya mendapatkan satu salinanClass<T>kode untuk semuaTs; ditambah salinan tambahan untuk setiap jenis nilai yangTbenar-benar digunakan.