Objektorientierung / Polymorphismus

DennisXX

Bekanntes Mitglied
Ich habe mal zwei Fragen:

Folgende Codezeile ist gegeben:

Java:
Iinterface ityp1 = (Iinterface)Naming.Lookup(IrgendeinObjekt);

Das Beispiel ist aus Java Rmi bzw. Verteilten Anwendungen. Warum muss hier zwingend mit (Iinterface) gecastet werden? Warum kann ich das nicht weglassen?


Ein weiteres Beispiel:

Ich habe drei Klasse (Klasse A, Klasse B, Klasse C).

B erweitert A und C erweitert B.

Frage:

WKann ich eigentlich im Rahmen des Polymorphismus solche Codezeilen schreiben?
Java:
Object o = new A();

oder

Java:
Object 0 = new C();

Geht das und falls nein warum nicht?

Danke für die Mithilfe !!
 
Java:
Iinterface ityp1 = (Iinterface)Naming.Lookup(IrgendeinObjekt);

Das Beispiel ist aus Java Rmi bzw. Verteilten Anwendungen. Warum muss hier zwingend mit (Iinterface) gecastet werden? Warum kann ich das nicht weglassen?
Dazu müsste man die Definition von Naming.Lookup (übrigens. eine seltsame Schreibweise; normalerweise schreibt man Methodennamen klein) kenne; ich nehme aber mal an, dass diese Methode kein Iinterface, sondern eher ein Object liefert. Und dann muss man casten, um dem Compiler zu sagen "ja, mir ist klar, dass dieser Methode im Prinzip irgendein Object liefert kann; ich bin mir aber sicher, dass es zur Laufzeit eine Instanz einer Klasse sein wird, die Iinterface implementiert". Damit überbrückt man quasi die Typprüfung zur Compile-Zeit und verlagert sie in die Laufzeit- wenn die Methode kein passendes Objekt liefert, gibt es einen Laufzeitfehler.
 
Zu deiner zweiten Frage:
Das ist zwar möglich, aber weil die Referenz dann vom Typ Object ist, kannst du damit dann auch nur noch die Methoden und Instanzvariablen erreichen, die in der Klasse Object deklariert sind. Sollte deine abgeleitete Klasse neue Methoden/Instanzvariablen haben, kannst du die damit afaik nicht erreichen.
 
Ich habe drei Klasse (Klasse A, Klasse B, Klasse C).

B erweitert A und C erweitert B.

Frage:

WKann ich eigentlich im Rahmen des Polymorphismus solche Codezeilen schreiben?
Java:
Object o = new A();

oder

Java:
Object 0 = new C();

Geht das und falls nein warum nicht?
Ersteres geht, weil in Java alle Klassen (also auch A) von java.lang.Object abgeleitet sind und diese Zuweisung damit eine Verallgemeinerung ausnutzt ( "alle A-Instanzen müssen zwingend auch Instanzen der Klasse java.lang.Object sein").

Letzteres geht nicht, weil 0 kein gültiger Bezeichner für eine Variable ist (vermutlich ist das aber nicht wirklich, was Du wissen wolltest; vielleicht konkretisierst Du die Frage nochmal)
 
Ich meinte natürlich

Java:
Objekt o = new C();


Würde eigentlich

Java:
C varc = new Object();

oder
Java:
A vera = new Object();

eigentlich funktioniern oder geht das nicht?

Wäre denn das machbar:

Java:
A vera;

(Object) vera = new Object();
 
Ich meinte natürlich

Java:
Objekt o = new C();


Würde eigentlich

Java:
C varc = new Object();

oder
Java:
A vera = new Object();

eigentlich funktioniern oder geht das nicht?
Nein, das geht nicht. Einer Variablen vom Typ A kannst Du nur Objekte zuweisen, die ebenfalls vom Typ A oder von einem von A abgeleiteten Typ ist (mal angenommen, A ist eine Klasse und kein Interface).

DennisXX hat gesagt.:
Wäre denn das machbar:

Java:
A vera;

(Object) vera = new Object();
Auch nicht; ein Cast auf der linken Seite einer Zuweisung ist Quatsch.
 
Wäre denn das machbar:

Java:
A vera;

(Object) vera = new Object();



A vera = new A();
Object o;

o = vera; // funktioniert
a = o; // geht jetzt auch, da in o momentan eine referenz auf ein objekt der klasse A liegt

o = new Object();

vera = o; // geht nicht, da object nicht vom typ der klasse A ist (und in vera dürfen nur referenzen auf objekte vom typ der Klasse A abgelegt werden [oder von den subklassen])

vera = (A) o; // könnte jetzt funktionieren, kann aber auch einen laufzeitfehler geben 😉
 
Zuletzt bearbeitet:

Zurück
Oben