\begin{slide}{Generische Polymorphie}

parametrische Polymorphie:
\begin{itemize}
\item Klassen und Methoden 
  können Typ-Parameter erhalten.
\item innerhalb der Implementierung der Klasse/Methode
  wird der formale Typ-Parameter
  als (unbekannter) Typ behandelt
\item bei der Benutzung der Klasse/Methode
  müssen alle Typ-Argumente angegeben werden

  (oder der Compiler inferiert diese in einigen Fällen)
\item separate Kompilation (auch von generischen 
  Klassen) mit statischer Typprüfung
\end{itemize}

\end{slide}

\begin{slide}{Bsp: Generische Methode in C\#}

\begin{verbatim}
class C {
   static T id<T> (T x) { return x; }
}

string foo = C.id<string> ("foo");
int    bar = C.id<int>    (42);
\end{verbatim}

\end{slide}

\begin{slide}{Bsp: Generische Klasse in Java}

\begin{verbatim}
class Pair<A,B> {
  final A first; final B second;
  Pair(A a, B b) 
    { this.first = a; this.second = b; }
}
Pair<String,Integer> p = 
    new Pair<String,Integer>("foo", 42);
int x = p.second + 3;
\end{verbatim}
vor allem für Container-Typen
(Liste, Menge, Keller, Schlange, Baum, \dots)  

\end{slide}

\begin{slide}{Bsp: Generische Methode in Java}

\begin{verbatim}
class C {
  static <A,B> Pair<B,A> swap (Pair<A,B> p) { 
    return new Pair<B,A>(p.second, p.first);
  } }
Pair<String,Integer> p = 
    new Pair<String,Integer>("foo", 42);
Pair<Integer,String> q = 
    C.<String,Integer>swap(p);
\end{verbatim}
Typargumente können auch inferiert werden:
\begin{verbatim}
Pair<Integer,String> q = C.swap(p);
\end{verbatim}
\end{slide}




