Dynamisch casten - möglich? wie?

  • Themenstarter Themenstarter pir187
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
P

pir187

Gast
Hallo,

ich habe ein Problem:

ich möchte ein Objekt auf einen bestimmten Typ casten, den ich nicht fest kenne, sondern der dynamisch ist. Der Typ des Objektes soll dabei dem entsprechen, den ein neu erstelltes Objekt hat.

Beispiel:
Code:
// Erstellen eines Objektes, dessen Namen ich dynamisch variieren muß
Object existingObject;

Class newClass = Class.forName("myClassName");

// Casten des bereits existierenden Objektes auf den Typ von newClass
existingObject = (typeOfNewClass)existingObject;    // o.k.

Das Problem ist nun folgendes:
ich hole mir den String "myClassName" , der als Parameter für
Code:
Class.forName
dient, aus einer dynamisch initialisierten Hashtable, deren Elemente ich nicht kenne. Also kenne ich auch den Typ nicht, den newClass annehmen wird.
Ich will aber oldObject auf genau diesen Typ casten, ohne für alle möglichen Klassenvarianten eine neue Zeile a la
Code:
existingObject = (targetType)anotherObject;
zu benötigen.


Gibt es mit JAVA 1.4 eine Möglichkeit, oldObject in den Typ von newClass zu casten? Ich bin für jegliche Hilfe dankbar, da das Problem gelöst werden muß.

MfG, pir187
 
nein. das geht nicht und hat auch keinen zweck 😉
mit java 1.5 gehts: Class#cast() und mit generics macht das dann auch sinn. (mehr oder weniger)
 
>> oldObject in den Typ von newClass zu casten?

wie sollte das auch aussehen? was würdest du dann im Quelltext schreiben??

dynObjekt.jetztEinMethodenNamevondemichnixweiss

was sollte wohl der Compiler damit machen? was willst du damit machen??

verwende Interfaces und dergleichen, diese Funktionalität kann es in Java gar nicht geben...
 
Ich versuche, meine Erklärung zu verbessern:

Bei der Inter-Applet-Kommunikation kann ein Applet Methoden eines anderen Applets aufrufen. Dabei muß das rufende Objekt aber in den Typ des gerufenen Objektes gecastet werden, bevor es eine Methode des gerufenen Applets rufen kann.

Meine verschiedenen Appletklassen sind alle von JApplet abgeleitet. Jedes hat aber seinen eigenen Typ.
Ein Applet eines bestimmten Subtyps bekommt als Parameternamen den Typ eines anderen Subtyp-Applets und als Parameterwert den Namen mitgeteilt, unter dem dieses andere Sybtyp-Applet auf der HTML-Seite eingefügt ist. Dieses Wertepaar wird in eine interne Hashtable eingefügt. Dabei ist der Parametername der Key und der Parameterwert (also der Instanzenname innerhalb der HTML-Seite) der Value eines Hashtableeintrages.

Im zweiten Schritt soll das Applet von allen Elemente dieser Hashtable, also von allen anderen auf der Seite benutzten Appletklassen, jeweils eine Instanz anlegen. Dabei kennt es vorher die Typen nicht, das ist eine dynamische Anzahl anderer JApplet-Subklassen. Dazu wird o.g. Hashtable durchlaufen und mit
Code:
Class newClass = Class.forName(hashtable.get(hashtable.nextElement()))
ein neues Objekt dieses nun dynamischen Typs erstellt werden.
Ich weiß ja nie, welchen Typ ein neues Objekt haben soll, weil ich den Inhalt der Hashtable (eigentlich) nicht kenne.

Das Erstellen dieses Objektes mit der dynamischen Typisierung klappt ja. Aber nun will ich ein anderes JApplet, das ich durch eine Methode als return-Typ geliefert bekomme, in den selben Typ casten, den auch newClass hat. Aber wie kann ich diesen Wert als Ausdruck in der Cast-Klammer nutzen?


Fragt bitte nicht danach, ob das sinnvoll ist. Für mein Szenario ist es das, sonst hätte ich die Frage nicht gestellt.
Ich möchte also das return-Objekt einer Funktion auf den Typ eines Objektes casten, dessen Typ auch dynamisch (Argument = String wird aus Hashtable geholt) ermittelt habe. Geht dies?


Danke, pir187
 
Hallo,

Das Problem ist ja auch das du "irgendwas" auf was anderes casten willst.
Das ist nicht sinnvoll weil du (bzw. der Compiler) ja gar nicht weiß ob das überhaupt geht.

Du willst doch Methoden des anderen Applets aufrufen, korrekt? Also haben alle Applets gemeinsame Methoden
=> mach ein Interface das diese gemeinsamen Methode enthält und implementiere das Interface in allen Applets.
Jetzt kannst du zum Interface-Typ casten und dann damit die gemeinsamen Methoden aufrufen.


mfg
Christian
 
schreib dir halt ein grundlegendes Interface und caste auf das ?!

edit: achne nova - das hast du ja auch schon geschrieben :wink:
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben