PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : dynamisch Casten



AlexNet
25-05-2006, 15:34
Hello alle zusammen.
Ich möchte mich gleich bevor ich zu meinem Problem komme für die kommenden Beiträge im Voraus bedanken . Vielen Dank :)

Mein Problem liegt daran das ich erst zur Laufzeit erfahre auf welchen (Java)Type ein Object gekastet werden muss, bevor dieses an eine Methode übegeben wird.
Leider fand ich bis jetzt nichts passendes.
Ein Beitrag zu diesem Thema habe ich in diesem Forum schon gelesen doch kann damit nichts anfangen. :o

Qudus
25-05-2006, 16:12
Stichwort "Java Reflections"

Versuch mal Folgendes (nicht getestet, reine Theorie):


ClassX x = new ClassX();

ClassA a = new ClassA();
ClassB b = new ClassB();
ClassC c = new ClassC();

xyz.method1(x.getClass().cast(a);
xyz.method2(x.getClass().cast(b);
xyz.method3(x.getClass().cast(c);

oder:


xyz.method1(x.getClass().cast(a.getClass());
xyz.method2(x.getClass().cast(b.getClass());
xyz.method3(x.getClass().cast(c.getClass());

Es fällt mir allerdings schwer, ein Szenario zu entwerfen. Vielleicht wäre ein Code-Auszug aus deinem Programm ganz hilfreich. Anhand welcher Bedingungen willst Du denn entscheiden, in welchen Typ gecastet werden soll?

Gruß, Qudus

mwanaheri
25-05-2006, 17:00
Mir fallen da zwei Möglichkeiten ein, die allerdings beide voraussetzen, dass nur ein bestimmer Satz von Objekttypen kommen kann:
1) verzweigung.
mit .getClass kannst du ja abfragen, um welche Klasse es sich handelt, also kannst du auch danach verzweigen, z.B. if (o.getClass == Klasse.class)

2) Überladung
Du kannst eine Methode schreiben, die die Umwandlung vornimmt und diese überladen, indem du unterschiedliche Klassen als Parameter angibst.

AlexNet
25-05-2006, 18:24
Sorry, eine Problembeschreibung ist natürlich eine sinvolle Sache. :)

Ich versuche das Konzept der Objektorientierung nachzuprogrammieren.
Dazu habe ich unter anderem eine Klasse die bei mir MyObject heißt angelegt.
Diese muss Werte beliebiger Attribute entgegennehmen können und weiter leiten.
Da es natürlich am Anfang noch garnicht bekannt ist um welchen Datentyp es sich handeln wird nehme ich ein Objecttype entgegen.
Dieser muss dann aber in den Ursprungszustand konvertiert werden.
Die Name der Klasse zu erfahren ist nicht all zu schwär das stimmt.

Doch wie führe ich Casting zu Laufzeit dürch???

Aber danke für den Tipp zu "Java Reflections" habe was nachgeschaut und vollgendes gefunden. Am besten gebe ich hier ein Beispiel an. Sieh doch dazu
Das Onlinebuch Javainsel4 unter dem Link:

http://www.galileocomputing.de/openbook/javainsel4/javainsel_06_012.htm#Rxx365java06012040001D41F0321 00

Ich habe es zwar noch nicht ausprobiert in meinem Program doch hoffe das es klappt. Ich werde dann mich auf jeden Fall zurückmelden
Also vielen Dank noch einmal. ;)

Code Auszug:

public class MyObject extends CXMLify {

public static HashMap objectDct = new HashMap();
private HashMap valueDic = new HashMap();
private MyClass objectType;
private int id;
private int refCounter = 0;
private String hasOwner;

public MyObject(MyClass objectType){

this.objectType = objectType;
this.id = getID();
this.refCounter = 0;
this.hasOwner = "False";
MyObject.objectDct.put(this.get_id(), this);// eigenes Object in objectDct hinzufügen

// Object der Klasse Attr hollen
Iterator it = this.objectType.AttrDic.entrySet().iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry)it.next();
String key = entry.getKey().toString();
String name = entry.getValue().toString();
try{
Object o = entry.getValue().getClass().newInstance();
if( ((Attr)o).defaultValue.equals("None") ){
this.set_value(key, ((Attr)o).defaultValue);
}
} catch (ClassCastException e) {
System.out.println(e.toString());
} catch (InstantiationException e) {
System.out.println(e.toString());
} catch (IllegalAccessException e) {
System.out.println(e.toString());
}
}
}

public void set_value(String key, Object value){
Attr attr = (Attr)this.objectType.get_attr(key);
this.valueDic.put(key, new Value(attr,value));
}