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
Lepaskan: 2025-01-20 17:12:10
asal
895 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk
  • Penyongsangan (parameter input):
<code class="language-java">interface MyInterface<in T> {
    void set(T value); // T 必须是 T 的原始类型的子类型
}</code>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan