Rumah  >  Artikel  >  Java  >  Penggunaan lanjutan generik fungsi Java: pemadaman jenis dan penggantian generik

Penggunaan lanjutan generik fungsi Java: pemadaman jenis dan penggantian generik

WBOY
WBOYasal
2024-04-27 08:36:02742semak imbas

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 ErasureJava 函数泛型的高级用法:类型擦除和泛型重写

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 8742468051c85b06f0a0af9e3e506b5c) digantikan dengan Objek.

Sebagai contoh, pertimbangkan kaedah generik berikut:

<T> T max(T x, T y) {
    // ...
}

Pada masa penyusunan, kaedah ini akan dipadamkan taip dan ditukar kepada kod bait berikut:

max(Object x, Object y) {
    // ...
}

Timpa generik

8742468051c85b06f0a0af9e3e506b5c)都会替换为 Object

例如,考虑以下泛型方法:

public static <T extends Number> void print(T value) {
    // ...
}

public static void print(Object value) {
    // ...
}

在编译时,此方法将被类型擦除并转换为以下字节码:

public static void print(Object value) {
    // ...
}

泛型重写

泛型类型参数无法在运行时访问。然而,使用类型擦除,Java 编译器允许对泛型方法进行重写,在不同的泛型类型之间实现不同的行为。

例如,考虑以下两个重载方法:

rrreee

尽管第一个方法是泛型的,但它们在运行时都将被编译成相同的字节码,如下所示:

rrreee

因此,在编译时,泛型类型变量 {T extends Number} 会被擦除为 Object,并且重写会被解析为针对 ObjectParameter 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.

Sebagai contoh, pertimbangkan dua kaedah terlebih beban berikut:

rrreee

Walaupun kaedah pertama adalah generik, kedua-duanya akan disusun ke dalam bytecode yang sama pada masa jalan, seperti berikut:

rrreee
    Oleh itu, Pada masa penyusunan, pembolehubah jenis generik {T extends Number} akan dipadamkan kepada Object dan penggantian akan diselesaikan untuk menyasarkan pelaksanaan jenis Object.
  • Kes Praktikal
  • Berikut ialah beberapa kes praktikal yang menggunakan pemadaman jenis dan penulisan semula generik:
  • Bekas Universal Bersatu:
  • Menggunakan senarai atau peta generik, anda boleh menyimpan objek daripada jenis yang berbeza dan menggunakan operasi yang sama, tanpa membuat operasi yang sama , bekas berasingan untuk setiap jenis.
  • Nilai pulangan kovarian:
Menggunakan kaedah nilai pulangan kovarian generik boleh dilaksanakan, yang bermaksud kaedah ganti ganti subkelas boleh mengembalikan jenis yang lebih khusus daripada kaedah ganti ganti kelas induk.

🎜Parameter kontravarian: 🎜Penggantian generik juga menyokong parameter kontravarian, yang bermaksud bahawa parameter kaedah ganti subkelas boleh menjadi jenis yang lebih umum daripada kaedah ganti ganti kelas induk. 🎜🎜🎜Memahami pemadaman jenis dan penulisan semula generik adalah asas untuk pemahaman mendalam tentang generik Java. Dengan memahami mekanisme ini, pembangun boleh menulis kod yang fleksibel dan selamat jenis serta memanfaatkan sepenuhnya keupayaan generik Java. 🎜

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn