Antwort auf: Crashkurs-Aufgaben zu Polymorphie

EIDI-Crashkurs 2020 Crashkurs-Aufgaben zu Polymorphie Antwort auf: Crashkurs-Aufgaben zu Polymorphie

#3189

Zusatzaufgabe: Polymorphie mit parametrisierten Klassen (Generics)

Die Java-Dateien der Polymorphie-Aufgaben aus dem Crashkurs findest du hier.
Die unkommentierte Lösung zu dieser Aufgabe findest du hier, ein Objektdiagramm hier.

public class GenericPoly {
   static class A<T extends B> {
      protected T e;
      public void set(T elem) { e = elem; }
      void f(B b) { System.out.println("A.f(B)"); }
      void f(C<E> c) { System.out.println("A.f(C)"); e.f(e); c.f(e); }
      void g(F f) { System.out.println("A.g(F)"); }
   }
   static class B extends A<B> {
      public B() { set(this); }
      void f(C<E> c) { System.out.println("B.f(C)"); }
      void f(F f) { System.out.println("B.f(F)"); this.g(f); }
   }
   static class C<R extends E> extends B {
      public R e;
      public C(R r) { this.e = r; }
      void f(B b) { System.out.println("C.f(B)"); }
      void f(A<C<E>> a) { System.out.println("C.f(A)"); a.f(this); }
      void g(F f) { System.out.println("C.g(F)"); e.g(f); }
   }
   static class D extends A<C<E>> implements E {
      protected A<B> e;
      public D() { e = new C<D>(this); }
      public void f(D d) { System.out.println("D.f(D)"); e.f(super.e); }
      public void g(F f) { System.out.println("D.g(F)"); }
      public void g(E e) { System.out.println("D.g(E)"); }
   }
   interface E {
      void g(E e);
   }
   static class F extends D {
      void f(A<C<F>> a) { System.out.println("F.f(A)"); this.f(a.e); }
      public void f(D d) { System.out.println("F.f(D)"); super.f(this); }
   }
   public static void main(String[] args) {
      A<C<F>> a = new A<>();
      C<F> c = new C<>(new F());
      a.set(c);
      D d = c.e;
      d.f(c);       // Aufruf 1
      c.f(a.e);     // Aufruf 2
      d.f(a);       // Aufruf 3
      d.f(d);       // Aufruf 4
      c.f(d);       // Aufruf 5
      d.e.f(c);     // Aufruf 6
      ((F)d).f(a);  // Aufruf 7
      c.f((F)d);    // Aufruf 8
      a.f(((A<C<E>>)d).e);  // Aufruf 9
   }
}