Der Compiler weiß nicht, welche Klasse stellt dies zu,
Class<?>
und der einzige Hinweis, es in Bezug auf das Objekt weiß ist, dass es eine übergeordnete Klasse hat, die erst doStuff1 (int)
Wenn Sie doStuff1 (String) wirklich aufrufen möchten, erstellen Sie eine andere abstrakte Unterklasse, die diese Methode enthält, und markieren Sie diese Methode als abstrakt. Die vorhandenen Unterklassen sollten diese neue Unterklasse erweitern.
public abstract class NewSubclass extends Superclass {
public void abstract doStuff1(String);
}
Dann in Ihrer Methode, einen generischen Parameter hinzuzufügen wie
public <T extends NewSubclass>void bla(Class<T> childClass, SuperClass childClassInDisguise) {
(childClass.cast(childClassInDisguise)).doStuff1(myString);
}
Auf diese Weise der Compiler die Vererbungshierarchie des Objekts weiß, welche Unterklassen des NewSubclass sind, die die abstrakte Methode enthält. wenn die Bedingung in anderen bekannten Subklassen
EDIT
Wenn Sie nur bla Methode bearbeiten können, versuchen Sie dies,
public void bla(Class<?> childClass, SuperClass childClassInDisguise) {
if(childClass.equals(ChildClass1.class) {
(ChildClass1(childClassInDisguise)).doStuff1(myString);
} else ... {
}
}
das gleiche tun. Ich weiß, dass es hardcodiert ist, aber dies ist der einzige Weg, wenn Sie die generische + abstrakte Superklasse nicht verwenden können, indem Sie die beteiligten Klassen modifizieren. Aber ich bevorzuge immer noch meinen ersten Vorschlag, da es weniger Code und Dynamik hat, wie wenn du eine andere Unterklasse hinzufügst, du musst die bla-Methode nicht erneut ändern (die Kraft von POLYMORPHISM), im Gegensatz zum zweiten Vorschlag. Dies ist eher ein Problem der Designrekonstruktion.
(vielleicht unabhängig) Wenn Sie es in jeder Kindklasse implementieren, warum machen Sie es nicht abstrakt? Auch: Ich habe diese Art von Besetzung nie gesehen (nicht zu sagen, dass es nicht funktioniert); warum nicht das klassische '((SuperClass) childInDisguise) .doStuff1 (myString);'? – dquijada
Ist 'doStuff1 (String)' eine Methode der Basisklasse? –
'' '(childClass.cast (childClassInDisguise))' '' gibt ein Objekt zurück, nicht SuperClass. Ändern zu '' 'void blah (Klasse Erweitert SuperClass>' '' – Joseph