# Kovarianz und Kontravarianz, wann ist es Typsicher



## Spot84 (21. Sep 2009)

Hallo!
ich versuche mich gerade auf eine Prüfung vorzubereiten und in dieser geht es um Kovarianz und Kontravarianz im Bezug auf Typsicherheit.Hierfür hab ich mir das Buch "Objektorientierte Softwareentwicklung mit UML" geholt.

In diesem wird z.b. bei der Typsicherheit beschrieben das Kontravarianz bei den Eingabeparametern typsicher ist, jedoch nicht bei den Ergebnisparametern. In dem Buch wird auch ein Beispiel dazu gegeben. Das Beispiel ist auch hier zu finden:Objektorientierte ... - Google Bücher

der Fehler tritt in dem Beispiel an der Stelle 

```
f.setFzgFuehrer(john);
```
auf,  wobei john vom Typ Traktorist ist. 

Das verstehe ich allerdings nicht wirklich. Es wurde doch geschrieben das Kontravarianz bei den Eingabeparametern typsicher ist und somit an dieser Stelle keine Fehler auftreten dürften.  setFzgFuehrer(john) nutzt aber doch die Eingabeparameter und trotzdem tritt ein Fehler auf?
Der Fehler müsste doch viel mehr bei den getMethoden auftreten, oder seh ich das falsch?
Zumal sie das weiter oben ja auch schreiben..

Dieses Beispiel verwirrt mich sehr, kann mir das villeicht jemand erklären?

Vielen Dank!


----------



## SlaterB (21. Sep 2009)

was die Konzepte genau bedeuten würde ich wohl erst nach noch ner Stunde Lesen begreifen, 
aber auf keinen Fall bedeuten sie, dass man jeden Mist übergeben kann und es dann klappt 

die Fehlermeldung ist doch gerade eine Eigenschaft von Typsicherheit,
wenn kein Fehler kommt, dann ist gut, sonst wird man gewarnt,
es kann sich kein Fehler in ein erfolgreich kompiliertes Programm einschleichen,


an ein Fahrzeug muss man einen Fahrer übergeben,
FALLS das Fahrzeug ein Traktor ist (muss ja nicht sein), ist das auch in Ordnung, denn ein Fahrer ist automatisch auch ein Traktorist,
es wird also garantiert die Methode von setFzgFuehrer von Traktor aufgerufen

bei umgekehrter Vererbung wäre das nicht so, dann wird nur die Methode der super-Klasse aufgerufen und im Traktor das Klassenattribut nicht initialisiert


----------



## Spot84 (21. Sep 2009)

Vielen Dank SlaterB das du versuchst mir zu helfen!!
So ganz klar ist mir das allerdings noch nicht. Ich versuch es noch einmal anders zu verdeutlichen.
Ein Programm ist ja in jedem Fall typsicher wenn die Eingabetypen Kontravariant und die Ergebnistypen Kovariant sind.
Als Beispiel für ein UML-Diagramm das typsicher ist, nehm ich mal wieder das, aus dem Buch:
Objektorientierte ... - Google Bücher

In diesem Beispiel dürfte jetzt ja nie ein Fehler aufgrund der Typsicherheit auftreten.
Vergleiche ich dieses Beispiel jetzt mit dem Beispiel der Kontravarianz(Objektorientierte ... - Google Bücher) hat sich im Prinzip nicht viel geändert. Die Vererbungsbeziehung der Typen ist gleich. Weiterhin sind die Typen in den SetFzgFuehrer-Methoden ebenfalls gleich.

Das heisst doch das ich den gleichen Beispielquelltext wie bei der Kontravarianz nehmen könnte und ebenfalls einen Fehler bekomme, oder nicht?  Wieso tritt hier jetzt kein Fehler auf? Der Fehler kam ja an der Stelle zustande als ich einem Fahrzeug einen Traktoristen übergeben habe. Das gleiche kann ich bei der Typsicheren Spezifikation aber doch auch machen.. Wieso kommt dort kein Fehler?


----------



## SlaterB (21. Sep 2009)

wer sagt denn dass da kein Fehler kommt? wobei du 'da' und 'der Fehler' recht schwammig benennst, 
klingt so als meinst du exakt den gleichen Code nur mit den wenigen Änderungen von Kontra_Fahrzeug auf Sicher_Fahrzeug usw.,

im Buch ist dazu kein Code, ich selber vermute, dass der Fehler bleiben wird,
hast du dir ein Beispiel programmiert oder worum geht es genau?

-----

das Konzept/ die Beschreibung 'sicher' bezieht sich nun doch auf den geänderten Rückgabewert der get-Methoden,
zu denen gibts gar kein Code-Beispiel


----------



## Spot84 (21. Sep 2009)

> wer sagt denn dass da kein Fehler kommt? wobei du 'da' und 'der Fehler' recht schwammig benennst,
> klingt so als meinst du exakt den gleichen Code nur mit den wenigen Änderungen von Kontra_Fahrzeug auf Sicher_Fahrzeug usw.,


ja genau das meinte ich. Ich hab einfach angenommen das hier kein Fehler mehr kommt, da diese Spezifikation ja typsicher sein soll. 

Mir fällt aber gerade auf das der Fehler bei der Kontravarianz ja während der Übersetzungszeit erkannt wird und somit doch statische Typsicherheit bei den Eingabeparametern garantiert wird. Hab mich immerzu so auf diesen Fehler eingeschossen, dass ich dachte die meinen das es zur Übersetzungszeit nicht typsicher ist.. :/



> im Buch ist dazu kein Code, ich selber vermute, dass der Fehler bleiben wird,
> hast du dir ein Beispiel programmiert oder worum geht es genau?



Ja du hast recht! Der Fehler bleibt auch. Er wird allerdings zur Übersetzungszeit erkannt und somit ist es dann statisch typsicher und alles ist richtig. Selbst programmiert hab ich nichts, ich wolte nur das Prinzip verstehen.

SlaterB ich dank dir vielmals! Hab mich so mit diesem Fehler verrandt das ich vergessen hab was statische Typsicherheit überhaupt bedeutet, nämlich das man zur Übersetzungszeit feststellen kann das keine Nachrichten an ein Objekt gesendet werden für die das Objekt keine entsprechende Schnittstelle besitzt.

Vielen Dank!


----------

