Hallo Leute,
ich habe etwas Schwierigkeiten mit dem Verständnis des Ko- und Kontravarianz Konzeptes in Java. Unser Uniskript formuliert das ganze etwas seltsam. Aber bevor ich euch nach korrekter Definition der Begriffe frage, frage ich euch lieber, ob ich das Konzept anhand der folgenden Beispiele verstanden habe.
Beispiel 1) Kovarainz für Ergebnistypen
Class A { ... }
Class B extends A { ... }
Class Mensch
{
public A methode()
{
...
return A;
}
}
Class Kind extends Mensch
{
// Diese Redeklaration von methode ist konform, weil die Ergebnistypen kovariant angepasst wurden.
public B methode()
{
...
return B;
}
}
Beispiel 1 wäre falsch, wenn ich die Ergebnistypen kontravariant anpasse.
Class A { ... }
Class B extends A { ... }
Class Mensch
{
public B methode()
{
...
return B;
}
}
Class Kind extends Mensch
{
// Diese Redeklaration von methode ist konform, weil die Ergebnistypen kovariant angepasst wurden.
public A methode()
{
...
return A;
}
}
Beipsiel 2) Kontravarianz für Typen von Parametern
Class A { ... }
Class B extends A { ... }
Class Obst
{
public void pfluecken(B obst)
{
...
}
}
Class Apfel extends Obst
{
// Diese Redeklaration ist konform, weil die Parametertypen Kontravariant angepasst wurden.
public void pfluecken(A obst)
{
...
}
}
Beispiel 2 wäre falsch, wenn ich die Parametertypen kovariant anpasse:
Class A { ... }
Class B extends A { ... }
Class Obst
{
public void pfluecken(A obst)
{
...
}
}
Class Apfel extends Obst
{
// Diese Redeklaration ist konform, weil die Parametertypen Kontravariant angepasst wurden.
public void pfluecken(B obst)
{
...
}
}
Also Zusammengefasst: Ergebnistypen dürfen kovariant angepasst werden, aber nicht kontravariant. Parametertypen dürfen kontravariant angepasst werden, aber nicht kovariant.