Cast ein Objekt der Klasse Typ als parameter übergeben
Habe ich eine übergeordnete Klasse und 2 Kind-Klassen. Ich bin versucht zu implementieren eine Funktion, die den Typ des Kindes und das Kind als Parameter.
Wenn ich child.newInstance()
ich wollen speichern Sie in einer Variablen des Typs übergeben wird, und rufen Sie eine Funktion aus dem zweiten parameter.
Unten sind die Klassen
public class Parent {
public void test() {
System.out.println("Test from parent");
}
}
public class ChildA extends Parent {
public void testChildA() {
System.out.println("Test from child a");
}
}
public class ChildB extends Parent {
public void testChildB() {
System.out.println("Test from child b");
}
}
und hier ist die Methode, die ich bin versucht zu implementieren
public class Driver {
Parent func(Class child, String whichChild) throws Exception {
//whichChild: "ChildA" or "ChildB"
Object obj = child.newInstance();
//cast obj to type of child and call the method "test" and "test" + whichChild
}
}
Kann es sein das getan, was ich zu tun versuche? Wenn ja, wie kann ich den cast dieses Objekt auf den Typ übergeben wird?
- Was willst du erreichen damit ? und warum gehst du nicht einfach überschreiben test in die Kinder?
- Ich kann es nicht ändern, die Struktur der Klassen und ich kann Sie nicht überschreiben die Methoden, weil das Kind verschiedene Methoden der anderen Funktionen, die ich Hinzugefügt die
super.test();
durch Fehler, sorry - Compile-time Sicherheit und statische Analyse sind sehr mächtige und nützliche Werkzeuge, wenn Sie mit Hilfe der reflection-API lösen Sie alle Vorteile, die Sie bieten. Sie werden nicht wissen, ob der code funktioniert, bis Sie es ausführen. Es wird nicht möglich sein, finden Verwendungen der Methoden-Aufruf per reflection. Auch IDE berichtet, dass Methoden, die nicht verwendet werden, die nicht wahr sein. Siehe Andy Turner ' s Antwort, was ist der beste Weg, so etwas zu tun.
- können Sie fügen Sie zusätzliche abstrakte Methode in
Parent
Klasse? - Nein, ich kann nichts hinzufügen, die
Parent
Klasse - Ich denke, Sie konzentrieren sich auf eine falsche Sache - Sie versuchen, ein problem zu lösen, aber Sie sollte das beheben der Ursache statt. Können Sie uns mehr Kontext über das, was diese Klassen wirklich? Warum kannst du nicht ändern
Parent
? Wie sind dieChild
Klassen verwendet? Was stellen Sie dar? - wenn
Parent
erklärt wird, wie du es beschrieben hast, d.h. die Klasse ist nichtfinal
, und mittest
nicht deklariertfinal
, es gibt nichts stoppen Sie das überschreibentest
. - Im Grunde
Parent
- Klasse verfügt über 2 private Felder mit get-und Set-Methoden, denen ein Fehler-code und Fehler-text-und child-Klassen, die Sie erweitern können, haben andere private Felder mit get-und Set-Methoden können zusätzliche Daten. Sie werden verwendet für Antworten von Funktionen, ob Sie erfolgreich waren oder nicht, so zum Beispiel, wenn ich will ein Kind mit verdächtigen parameter, der gab ein Problem, ich würde verlängern müssen, dieParent
- Klasse, und fügen Sie eine variable, um den verdächtigen variable - Es Klang wie der perfekte Ort für die Vererbung. Warum kannst du nicht ändern
Parent
Klasse? - Meine Funktionen sollten immer mit einem code und Fehler-text, so dass ich nur Hinzugefügt, diejenigen, die
Parent
Klasse, alle anderen Daten, die benötigt werden, für bestimmte Funktionen, die ist, warum gibt es Kinder, die Klassen mit den zusätzlichen Daten benötigt. - nur diejenigen, die
Parent
Klasse" - gut, das bedeutet, dass Sie es ändern können. So, jetzt die Vererbung verwenden, anstelle von Reflexionen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie fügen Sie eine Einschränkung
child
Sie brauchen nicht eine Besetzung, bei der alle bekommen, ein Elternteil:Allerdings können Sie immer noch nicht, rufen Sie die
testChildA
etc-Methode, da alles, was Sie haben, ist eine Instanz derParent
. Sie müssten verwenden Sie reflektion, um die Methode:Wäre es besser, eine Methode an der Schnittstelle
Parent
die Sie aufrufen können, und nicht in den Unterklassen.dann einfach anrufen:
oder, wie Emanuele Ivaldi Punkte heraus, nur überschreiben
test
imChildA
undChildB
aufrufen und direkt.testChildA
auch wennobj
istParent
imParent obj = child.newInstance();
?Method
entkoppelt ist von der Instanz, die es aufrufen, auf. Zum Beispiel könnten Sie nennenmethod.invoke("string")
- das Ergebnis in eine runtime-exception. Es ist bis zu Ihnen, um sicherzustellen, dass Sie nur aufrufen, es in einer Weise, die Sinn macht.Nicht genau wissen, was Sie tun, aber Sie können
Class.cast(...)
.ZB
return type.newInstance()
einfacher wäre.Class.cast(Object)
Versuchen, diese ein.
child
als parameter dann? Es hilft, wenn Sie Sie markieren, was Sie haben tatsächlich geändert, anstatt nur zu sagen "versuchen, diese code-block, der ohne Erklärung".Wage ich zu bezweifeln. Soweit die compiler betrifft, ist jede Instanz der Klasse kann geschickt werden als parameter.
So, für den compiler, es gibt keinen Beweis, dass diese Instanz tatsächlich eine Instanz des Typs, den Sie senden zusammen.
Class<? extends Parent>
Einschränkungen.