Nr. 1 Varianz bezueglich der Eingabeparameter Invarianz: class A { public void myFunc(A myparameter) { System.out.println("A::myFunc(...)"); } } class B extends A { public void myFunc(A myparameter) { System.out.println("B::myFunc(...)"); } } public class blatt2 { public static void main(String s[]) { (new B()).myFunc(new B()); (new B()).myFunc(new A()); } } Output: B::myFunc(...) B::myFunc(...) Wie man am Output erkennen kann wird unsere Ueberschreibung von myFunc in B zweimal aufgerufen, Invarianz bezueglich der Eingabeparameter ist also in Java moeglich. Kontravarianz class A { public void myFunc(B myparameter) { System.out.println("A::myFunc(...)"); } } class B extends A { public void myFunc(A myparameter) { System.out.println("B::myFunc(...)"); } } public class blatt2 { public static void main(String s[]) { (new B()).myFunc(new B()); (new B()).myFunc(new A()); } } Output: A::myFunc(...) B::myFunc(...) Da man auf einem Objekt von B immernoch die urspruengliche myFunc Funktion aus A aufrufen kann (wenn der Parameter vom Typ B ist) findet eine Ueberladung, keine Ueberschreibung statt => keine Kontravarianz in Java Kovarianz bezueglich der Eingabeparameter gibt es in Java auch nicht, da dies das Substitutionsprinzip verletzt. Varianz bezueglich der Ausgabeparameter Invarianz class A { public A myFunc() { System.out.println("A"); return this; } } class B extends A { public A myFunc() { System.out.println("B"); return this; } } public class blatt2 { public static void main(String s[]) { (new B()).myFunc(); } } Output: B Invarianz funktioniert also Kontravarianz bei Ausgabeparametern ist unsinnig, da Subst-Prinzip nicht erfuellt waere. Kovarianz class A { public A myFunc() { System.out.println("A"); return this; } } class B extends A { public B myFunc() { System.out.println("B"); return this; } } public class blatt2 { public static void main(String s[]) { (new B()).myFunc(); } } Output zur Kompilierzeit: blatt2.java:6: myFunc() in B cannot override myFunc() in A; attempting to use incompatible return type found : B required: A public B myFunc() { System.out.println("B"); return this; } ^ 1 error Es ist also nicht moeglich in Java Kovarianz im Ausgabeparameter zu verwenden, wie am Compileroutput zu erkennen.