Generik dalam Java ialah ciri berkuasa yang membolehkan keselamatan jenis pada masa penyusunan. Walau bagaimanapun, pelaksanaannya memperkenalkan cabaran apabila ia datang untuk mendapatkan literal kelas untuk jenis generik.
Masalahnya:
Biasanya, literal kelas diperoleh menggunakan sintaks berikut :
Class<Foo> cls = Foo.class;
Tetapi apabila ia datang kepada jenis generik seperti Senarai, komplikasi timbul:
Class<List> cls = List.class // warning: List should be parameterized
Menambah kad bebas, >, untuk menyamaratakan jenis mengakibatkan ralat tidak padan jenis:
Class<List<?>> cls = List.class // type mismatch
Percubaan untuk menentukan parameter jenis sebenar, mis. , Senaraikan
Penyelesaian:
Malangnya, adalah mustahil untuk mendapatkan literal kelas secara statik untuk jenis generik dengan parameter jenis khusus dalam Java. Ini disebabkan oleh proses yang dipanggil penghapusan jenis.
Semasa penyusunan, maklumat jenis generik dialih keluar, hanya meninggalkan jenis mentah. Contohnya, kedua-dua Senarai
Ini bermakna satu-satunya literal kelas yang wujud untuk jenis generik adalah untuk jenis mentah, mis., List.class.
Refleksi dan Pemadaman Jenis:
Manakala pemadaman jenis mengehadkan penggunaan huruf kelas untuk jenis generik, ia tidak menghapuskan sepenuhnya kewujudannya. Kaedah Field.getGenericType() dalam java.lang.reflect menyediakan akses kepada maklumat jenis generik semasa masa jalan. Walau bagaimanapun, kaedah ini terhad kepada introspeksi dan tidak boleh digunakan untuk mendapatkan literal kelas.
Kesimpulan:
Disebabkan pemadaman taip, tidak mungkin untuk mendapatkan literal kelas untuk parameterisasi khusus jenis generik. Literal kelas untuk jenis generik sentiasa mewakili jenis mentah, yang tidak mengekalkan maklumat parameter jenis.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mendapatkan Literal Kelas untuk Jenis Generik di Jawa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!