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
:
<code class="language-java">interface MyInterface<out T> { T get(); // T 可以是 T 的原始类型的任何子类型 }</code>
<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!