"Dynamic" - Casting in Java
Hullo alle,
Frage mich, ob es irgendwelche Java-Hacker, die können clue mich, warum Folgendes nicht funktioniert:
public class Parent {
public Parent copy() {
Parent aCopy = new Parent();
...
return aCopy;
}
}
public class ChildN extends Parent {
...
}
public class Driver {
public static void main(String[] args) {
ChildN orig = new ChildN();
...
ChildN copy = orig.getClass().cast(orig.copy());
}
}
Den code ziemlich glücklich zu kompilieren, aber beschließt, werfen eine classcastexception-Fehler zur Laufzeit D=
Edit: Wow, wirklich schnelle Antworten. Danke Jungs! So es scheint, ich kann nicht niedergeschlagen mit dieser Methode... gibt es irgendeine andere Möglichkeit, das zu tun downcasting in Java? Ich habe darüber nachgedacht, darüber, dass jeder ChildN
Klasse überschreiben copy()
, war aber nicht begeistert über das hinzufügen der zusätzlichen boilerplate-code.
Sie können es tun. Werfen Sie einen Blick auf mein edit. Ich obwohl Sie Probleme hatten Verständnis "casting" in den ersten Platz.
InformationsquelleAutor user50264 | 2008-12-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
(Kann nicht fügen Sie code in einem Kommentar, also werde ich hier hinzufügen)
Bezüglich Cloneable: wenn Sie die Implementierung Cloneable implementieren Sie ihn wie folgt; viel sauberer zu nennen...
[EDIT: ich habe auch gesehen, wie andere Leute benutzen
in den catch-block.]
InformationsquelleAutor Scott Stanchfield
Ist wie der Versuch, dies zu tun:
Ab und versucht dann zu:
Ihre Eltern Klasse und ChildN Klasse haben die gleiche Beziehung wie Objekt und String
Damit es funktioniert, müssen Sie Folgendes tun:
Ist, überschreiben Sie die "kopieren" - Methode und der Rückgabe die richtige Instanz.
BEARBEITEN
Wie pro Ihre Bearbeiten. Das ist tatsächlich möglich. Dies könnte ein möglicher Weg:
So dass Sie nicht haben, um das überschreiben der "kopieren" - Methode in jeder Unterklasse. Dies ist der Prototyp design pattern.
Jedoch mit dieser Implementierung, die Sie sollten sich bewusst sein, zwei Ausnahmen geprüft. Hier das komplette Programm, das kompiliert und läuft ohne Probleme.
Nicht in Java. Zumindest nicht im Java-Quellcode. Verwechseln Sie die Ausgabe leicht es wird darf in Java-byte-code...
Es ist erlaubt in source-code in Java 5+.
InformationsquelleAutor OscarRyz
Der cast ist effektiv versuchen, dies zu tun:
(Es läuft der cast durchführen, bei der Ausführung, aber das ist, was es sein wird, weil
orig.getClass()
wirdChildN.class
) Jedochorig.copy()
nicht wieder eine Instanz von ChildN, es gibt eine Instanz nurParent
, so kann es nicht gewirkt zuChildN
.InformationsquelleAutor Jon Skeet
Wenn ChildN nicht überschreiben, copy() liefert eine Instanz der ChildN, dann sind Sie versucht, niedergeschlagen ein Objekt des Typs Elternteil zu geben ChildN
InformationsquelleAutor erikkallen
java.lang.Class#cast(Object) throws classcastexception-Fehler, wenn Klasse#isInstance() gibt false zurück. Aus der javadoc für diese Methode:
Da ein Elternteil ist nicht eine Unterklasse von Kind, isInstance() gibt false zurück, so cast() wirft die Ausnahme. Dieser kann gegen das Prinzip der geringsten Verwunderung, aber es ist so zu arbeiten, wie es ist dokumentiert - cast() kann nur die Verallgemeinerung, nicht den Kopf hängen.
InformationsquelleAutor sk.
Könnte es sein, dass Sie wollen einfach nur eine Kopie/Klon des Objekts.
In diesem Fall implementiert das Cloneable-interface und überschreiben die clone() als notwendig.
Diese macht genau das, was Ihre "copy ()" - Methode versucht zu tun, in der Java-Weg.
(Ja, man könnte Lust Introspektion Spiele auch, aber diese Methoden Versagen oder werden, so hässlich, sobald Sie nicht über einen öffentlichen default-Konstruktor. Klonen funktioniert in jedem Fall, egal was Konstruktoren, die Sie haben.)
Dies könnte die "andere" Art und Weise. Es gibt keine Notwendigkeit, ändern Sie die Signatur der Methode ( Verwendung von Klon-und Rendite-Objekt ) kopieren, als Namen und Eltern als Gegenleistung tun sollten.
InformationsquelleAutor Thomas Morgner
Den Grund downcasting nicht funktioniert, ist, weil, wenn Sie die Besetzung eines übergeordneten Objekts, um ein Kind geben, theres keine Weise, die Sie aufrufen können und Kind geben die Methoden des übergeordneten Objekts. Aber es funktioniert anders...
InformationsquelleAutor Sathish