\begin{slide}{Subtyping}

(subtyping $=$ Vererbung)

Durch
\begin{verbatim}
( class | interface ) Foo 
    ( implements | extends ) Bar 
{ .. }
\end{verbatim}
wird \verb|Foo| zu Subtype von \verb|Bar|.

Prinzip der Objektorientierten Programmierung:

\begin{emph}
  Überall, wo ein Objekt der Basisklasse (hier: \verb|Bar|) erwartet wird,
  darf auch ein Objekt einer abgeleiteten Klasse (subtype, hier: \verb|Foo|) 
  benutzt werden.
\end{emph}

\end{slide}

\begin{slide}{Generics und Subtyping}

\begin{verbatim}
List<String> ls = new ArrayList<String>();
List<Object> lo = ls; // ??

lo.add (new Object ());
String s = ls.get (0); // !!
\end{verbatim}

D. h., die Annahme

\verb|S extends T  =>  G<S> extends G<T>|

führt zu Typfehlern.

Es gilt \emph{nicht} \verb|List<String> extends List<Object>|.


\end{slide}
