Masalah dengan
List<String> list = new LinkedList();
adalah bahwa di sisi kiri, Anda menggunakan tipe generik diList<String>
mana di sisi kanan Anda menggunakan tipe mentahLinkedList
. Jenis mentah di Jawa secara efektif hanya ada untuk kompatibilitas dengan kode pra-generik dan tidak boleh digunakan dalam kode baru kecuali Anda benar-benar harus melakukannya.
Sekarang, jika Java memiliki generik dari awal dan tidak memiliki tipe, seperti LinkedList
, yang awalnya dibuat sebelum generik, mungkin bisa membuatnya sehingga konstruktor untuk tipe generik secara otomatis menyimpulkan parameter tipenya dari kiri. Sisi-sisi penugasan jika memungkinkan. Tetapi tidak, dan itu harus memperlakukan tipe mentah dan tipe generik berbeda untuk kompatibilitas mundur. Itu membuat mereka perlu membuat cara yang sedikit berbeda , tetapi sama nyamannya, untuk mendeklarasikan instance baru dari objek generik tanpa harus mengulangi parameter tipenya ... operator berlian.
Sejauh contoh asli Anda List<String> list = new LinkedList()
, kompiler menghasilkan peringatan untuk tugas itu karena harus. Pertimbangkan ini:
List<String> strings = ... // some list that contains some strings
// Totally legal since you used the raw type and lost all type checking!
List<Integer> integers = new LinkedList(strings);
Generik ada untuk memberikan perlindungan waktu kompilasi terhadap melakukan hal yang salah. Dalam contoh di atas, menggunakan tipe mentah berarti Anda tidak mendapatkan perlindungan ini dan akan mendapatkan kesalahan saat runtime. Inilah sebabnya mengapa Anda tidak harus menggunakan jenis mentah.
// Not legal since the right side is actually generic!
List<Integer> integers = new LinkedList<>(strings);
Namun, operator intan memungkinkan sisi kanan penugasan untuk didefinisikan sebagai instance generik sebenarnya dengan parameter tipe yang sama dengan sisi kiri ... tanpa harus mengetikkan parameter itu lagi. Ini memungkinkan Anda untuk menjaga keamanan obat generik dengan upaya yang hampir sama dengan menggunakan jenis mentah.
Saya pikir hal utama yang perlu dipahami adalah bahwa jenis mentah (tanpa <>
) tidak dapat diperlakukan sama dengan jenis generik. Ketika Anda mendeklarasikan tipe mentah, Anda tidak mendapatkan manfaat dan tipe pemeriksaan generik. Anda juga harus ingat bahwa obat generik adalah tujuan umum dari bahasa Jawa ... mereka tidak hanya berlaku untuk konstruktor no-arg dari Collection
s!