Generik Java menghapuskan maklumat jenis generik melalui pemadaman jenis supaya semua generik diwakili sebagai Objek. Menggunakan pemadaman jenis, kaedah generik boleh ditindih untuk mencapai gelagat berbeza antara jenis generik yang berbeza. Ini membolehkan penyatuan bekas generik, melaksanakan nilai pulangan kovarian dan parameter kontravarian, memanfaatkan sepenuhnya fleksibiliti generik Java. . Walau bagaimanapun, memahami cara generik berfungsi di Java adalah penting untuk memahami mekanik asas.
Type Erasure
Pengkompil Java menggunakan type erasure untuk melaksanakan generik. Ini bermakna maklumat jenis generik dialih keluar daripada kod bait pada masa penyusunan. Pada masa jalan, semua jenis diwakili sebagai jenis primitifnya dan semua jenis parameter (seperti
) digantikan dengan
Objek
.
Sebagai contoh, pertimbangkan kaedah generik berikut:
T max(T x, T y) { // ... }
max(Object x, Object y) { // ... }
)都会替换为Object
。
例如,考虑以下泛型方法:
public staticvoid print(T value) { // ... } public static void print(Object value) { // ... }
在编译时,此方法将被类型擦除并转换为以下字节码:
public static void print(Object value) { // ... }
泛型类型参数无法在运行时访问。然而,使用类型擦除,Java 编译器允许对泛型方法进行重写,在不同的泛型类型之间实现不同的行为。
例如,考虑以下两个重载方法:
rrreee尽管第一个方法是泛型的,但它们在运行时都将被编译成相同的字节码,如下所示:
rrreee因此,在编译时,泛型类型变量{T extends Number}
会被擦除为Object
,并且重写会被解析为针对Object
Parameter jenis generik tidak boleh diakses semasa masa jalan . Walau bagaimanapun, menggunakan pemadaman jenis, pengkompil Java membenarkan kaedah generik untuk ditindih untuk mencapai tingkah laku berbeza antara jenis generik yang berbeza.
Walaupun kaedah pertama adalah generik, kedua-duanya akan disusun ke dalam bytecode yang sama pada masa jalan, seperti berikut:
rrreee{T extends Number}
akan dipadamkan kepada
Object
dan penggantian akan diselesaikan untuk menyasarkan pelaksanaan jenis
Object
.
Atas ialah kandungan terperinci Penggunaan lanjutan generik fungsi Java: pemadaman jenis dan penggantian generik. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!