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.