Heim > Backend-Entwicklung > C++ > Was ist der Unterschied zwischen Kovarianz und Kontravarianz in der objektorientierten Programmierung?

Was ist der Unterschied zwischen Kovarianz und Kontravarianz in der objektorientierten Programmierung?

Linda Hamilton
Freigeben: 2025-01-20 17:12:10
Original
855 Leute haben es durchsucht

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

Umfassendes Verständnis von Kovarianz und Kontravarianz

Kovarianz und Kontravarianz in der objektorientierten Programmierung ermöglichen das Ersetzen verschiedener Typen in verschiedenen Situationen unter Wahrung der Typsicherheit.

Kovarianz

Kovarianz gilt, wenn ein „Supertyp“ (allgemeiner) als Ersatz für einen „Subtyp“ (spezifischer) an der Ausgabeposition verwendet wird (z. B. als Rückgabewert). In diesem Fall können Sie eine Liste mit Supertypen einer Liste mit Untertypen zuweisen:

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

Kontravarianz

Kontravarianz gilt, wenn ein „Subtyp“ als Ersatz für einen „Supertyp“ an der Eingabeposition verwendet wird (z. B. als Methodenparameter). In diesem Fall können Sie einen Lambda-Ausdruck, der einen Untertyp akzeptiert, an einen Lambda-Ausdruck übergeben, der einen Supertyp erwartet:

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

Schlüsselwörter „in“ und „out“

Die Schlüsselwörter „in“ und „out“ in Generika werden verwendet, um die Varianz von generischen Parametern anzugeben. „out“ bedeutet Kovarianz, „in“ bedeutet Kontravarianz.

Im Beispiel der MyInterface-Schnittstelle:

  • Kovarianz (Rückgabewert):
<code class="language-java">interface MyInterface<out T> {
    T get(); // T 可以是 T 的原始类型的任何子类型
}</code>
Nach dem Login kopieren
  • Invertierung (Eingabeparameter):
<code class="language-java">interface MyInterface<in T> {
    void set(T value); // T 必须是 T 的原始类型的子类型
}</code>
Nach dem Login kopieren

Zusammenfassend lässt sich sagen, dass Kovarianz und Kontravarianz eine sichere Typsubstitution basierend auf der beabsichtigten Verwendung des generischen Typs ermöglichen und so die Typsicherheit gewährleisten und gleichzeitig Flexibilität beim Codedesign bieten.

Das obige ist der detaillierte Inhalt vonWas ist der Unterschied zwischen Kovarianz und Kontravarianz in der objektorientierten Programmierung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage