All pastes #255760 Raw Edit

Mine

public text v1 · immutable
#255760 ·published 2006-11-23 09:31 UTC
rendered paste body
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.