Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
Polymorphie Frage anhand der Aufgabe 7.3
Hallo,
um mir das Konzept der Polymorphie etwas vertrauter zu machen, habe ich etwas mit der Aufgabe 7.3 gespielt. Dabei ist bei folgendem Code:
AbstrakteAmpel meineAmpel = new KonkreteAmpel();
System.out.println(meineAmpel.umschalten(39L));
die Fehlermeldung
The method umschalten(int) in the type AbstrakteAmpel is not applicable for the arguments (long)
aufgetaucht.
Ich verstehe jedoch nicht ganz, warum diese Fehlermeldung erscheint. Die Methode umschalten wird ja in der Klasse KonkreteAmpel überschrieben und dank der dynamischen Typsicherheit bei Instanzmethoden sollte (meiner Meinung nach) eigentlich
Langes konkretes umschalten
ausgegeben werden…
Wo liegt denn hier mein Denkfehler?=)
Die Methode umschalten(int) aus AbstrakteAmpel wird von der Methode umschalten(long) aus Konkrete Ampel überladen (unterschiedliche Signatur!) Damit sollte deine Frage beantwortet sein;)
Ah okay, also erstmal danke für die Antwort, aber nochmal kurz zum nachbohren:
- Auf Folie 8-97 steht doch beim Überschreiben von Instanzmethoden
Und ist die Klausel in Klammern hier nicht anwendbar? long und int beschreiben ja beide Ganzzahlen…
- Egal ob umschalten hier jetzt überschrieben oder überladen wird, sollte meineAmpel aus meinem Beispiel nicht so oder so eine Methode umschalten für den Argumenttyp long haben? Weil das scheint ja hier irgendwie das Problem zu sein, dass keine Methode für den Argumenttyp long gefunden wird…
Ich hoffe, ich steh grad nicht mega auf dem Schlauch und überseh was offensichtliches
Mit Resultattyp ist der Rückgabetyp gemeint. Wir unterhalten und hier über Parametertypen.
- Egal ob umschalten hier jetzt überschrieben oder überladen wird, sollte meineAmpel aus meinem Beispiel nicht so oder so eine Methode umschalten für den Argumenttyp long haben? Weil das scheint ja hier irgendwie das Problem zu sein, dass keine Methode für den Argumenttyp long gefunden wird…
Die Methode ist schon „da“, das siehst du, wenn du
KonkreteAmpel meineAmpel = new KonkreteAmpel();
System.out.println(meineAmpel.umschalten(39L));
eintippst. Da deine Variable aber statischen Typ AbstrakteAmpel hat, beginnt die Suche nach einer möglichen Methode erst in der Klasse AbstrakteAmpel. Danach wird nur noch geprüft, ob die Methode in einer Unterklasse („auf dem Weg zum dynamischen Typ“) überschrieben wurde. Das ist hier aber nicht der Fall. Die Methode umschalten(long) aus KonkreteAmpel wird so nicht gefunden.
Ok, jetzt habs sogar ich verstanden Vielen Dank für die ausführliche Erklärung =)