Rumah >pembangunan bahagian belakang >C++ >Apakah Perbezaan Antara Kovarian dan Kontravarian dalam Pengaturcaraan Berorientasikan Objek?

Apakah Perbezaan Antara Kovarian dan Kontravarian dalam Pengaturcaraan Berorientasikan Objek?

Linda Hamilton
Linda Hamiltonasal
2025-01-20 17:12:10895semak imbas

What is the Difference Between Covariance and Contravariance in Object-Oriented Programming?

Pemahaman mendalam tentang kovarians dan kontravarians

Kovarian dan kontravarian dalam pengaturcaraan berorientasikan objek membenarkan penggantian jenis berbeza dalam situasi berbeza sambil mengekalkan keselamatan jenis.

Kovarian

Kovarian terpakai apabila "jenis super" (lebih umum) digunakan sebagai pengganti "subjenis" (lebih khusus) dalam kedudukan output (mis., sebagai nilai pulangan). Dalam kes ini, anda boleh menetapkan senarai supertype kepada senarai subjenis:

<code class="language-java">List<Fruit> fruits = new ArrayList<>();
List<Apple> apples = fruits; // 协变:List<Apple> 是 List<Fruit> 的子类型</code>

Percanggahan

Kontravarian dikenakan apabila "subjenis" digunakan sebagai pengganti "jenis super" pada kedudukan input (contohnya, sebagai parameter kaedah). Dalam kes ini, anda boleh menghantar ungkapan lambda yang menerima subjenis kepada ungkapan lambda yang menjangkakan superjenis:

<code class="language-java">Comparator<Apple> compareApples = (a, b) -> a.compareTo(b);
Comparator<Fruit> compareFruits = compareApples; // 逆变:Comparator<Apple> 是 Comparator<Fruit> 的子类型</code>

Kata kunci “masuk” dan “keluar”

Kata kunci "masuk" dan "keluar" dalam generik digunakan untuk menentukan varians parameter generik. "keluar" bermaksud kovarians, "dalam" bermaksud kontravarians.

Dalam contoh antara muka MyInterface:

  • Kovarians (nilai pulangan):
<code class="language-java">interface MyInterface<out T> {
    T get(); // T 可以是 T 的原始类型的任何子类型
}</code>
  • Penyongsangan (parameter input):
<code class="language-java">interface MyInterface<in T> {
    void set(T value); // T 必须是 T 的原始类型的子类型
}</code>

Ringkasnya, kovarians dan kontravarian membenarkan penggantian jenis selamat berdasarkan penggunaan jenis generik yang dimaksudkan, memastikan keselamatan jenis sambil menyediakan fleksibiliti reka bentuk kod.

Atas ialah kandungan terperinci Apakah Perbezaan Antara Kovarian dan Kontravarian dalam Pengaturcaraan Berorientasikan Objek?. 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