2010-11-24 17 views
0

Es scheint so offensichtlich. Wie kann ich ein Objekt myObjet in den Typ myObjet.getClass umwandeln? Ich habe versucht, Kombinationen von forName(), Cast und andere ... none zu arbeiten: sDynamic Casting:

Das Problem ist, dass ich eine Liste von Objekten habe und ich möchte sie zurück zu ihrem ursprünglichen Typ (was ist gegeben von myObjet.getClass.getName()).

Grüße, Tim


Ja, das Java ist und es ist sicherlich nicht falsch. Lassen Sie mich das Problem erklären. Stellen Sie sich ein Programm vor, das sich mit einfachen Formen wie Quadrate und Kreise befasst, die von Klassen, der Hauptklasse, abgeleitet sind.

So gibt es eine Suchfunktion, die ein Formular zurückgibt, aber Sie haben die Art zu schaffen, und eine Referenz der Form (eine Zahl, zum Beispiel):

Form myForm= searchForm(String formType, String formRef) 

Ich weiß, was das Formular es zurück wird sein, weil ich diese Argumente der Suchfunktion gegeben habe: zum Beispiel ein Quadrat. Das zurückgegebene Objekt wird immer noch ein Formular sein, aber ich möchte, dass es von der Square-Klasse ist, also muss ich es umwandeln. Es ist kompatibel, da Square von Form erbt.

Das einzige Problem ist, dass "formType" variabel ist, könnte es in der Tat quadratisch sein, aber es könnte auch "Circle" sein. Deshalb brauche ich eine generische Umwandlung für das Rückgabeobjekt.

Wenn ich eine myForm.getClass(). GetName(), bekomme ich "Square". Also muss ich myForm in myForm.getClass() umwandeln.

Sehen Sie das Problem?

+2

Welche Sprache ist das? –

+0

Dies scheint eine Art (falsches) Java zu sein. Auch ich verstehe den Weg nicht. Kannst du bitte Erklären? – dmeister

Antwort

0

Casting verändert das Objekt selbst nicht. Casting ändert nur, was der Compiler mit dem Objekt tun kann.

Java bietet zwei Möglichkeiten zu beschreiben, was Sie mit einem Objekt tun können: Klassen und Schnittstellen. Die Sache, in die Sie einwerfen, muss etwas sein, über das der Compiler zur Kompilierzeit informiert ist. Andernfalls kann der Compiler Sie nicht daran hindern, etwas Dummes zu tun, wie beispielsweise den Versuch, myCircle.bark() zu schreiben.

Sie haben also zwei Möglichkeiten: Wenn die Klassen etwas gemeinsam haben (eine implementierte Schnittstelle oder eine Klasse, von der alle abgeleitet sind), könnten Sie versuchen, diese allgemeine Beschreibung zu verwenden. Aber es klingt, als wäre das nicht das, was du willst. Stattdessen Sie Java Kräfte zu tun ist, eine Kette von if/else Aussagen zu haben, die versuchen, das Objekt zu jeder konkreten Klasse zu werfen, die Sie vielleicht etwas damit zu tun, wie Square, Circle usw.

Aber Gießen ein Objekt zu seiner eigenen Klasse macht keinen Sinn, weil es dem Compiler keine Informationen zur Kompilierzeit darüber gibt, welche Methoden das Objekt hat oder nicht hat.

+0

Alles klar - danke! – Tim