Runtime Java-Klassenerweiterung nicht funktioniert
-
19-09-2019 - |
Frage
Guten Tag, Ich habe folgendes Problem: Klasse B Klasse A erstreckt und Verfahren werden beide durch ein anderes Verfahren in einer anderen Klasse aufgerufen, nachdem die Instanziierung der Klasse B (Beispiel folgt):
public class A{
//fields
//constructors
//methods
}
public class B extends A{
//fields
//constructors
//methods
}
public class CALLER{
public A getA(enum E){
return Factory.getB(otherobject,E);
}
}
public class Factory{
public static B getB(object o,enum e){
//do something with enums and get B
b = new B();
//populate b
return b;
}
}
Klasse B außer Kraft setzt keine Methode der Klasse A. Irgendwie bei der Kompilierung bekommt dies keinen Fehler, sondern zur Laufzeit Klasse ANRUFER excepts: java.lang.NoSuchMethodError: Factory.getB (Objekt, Enum) A
Meine Frage ist: wenn B A erstreckt, warum ein Verfahren aus einer anderen Klasse A nicht, auch wenn seine Rückkehr Klausel direkt ein B kehrt Objekt zurückgeben kann? In der Tat Wechsel:
public static B getB(object, enum);
mit
public static A getB(object, enum);
löst die Ausnahme, aber dann bekomme ich eine weitere Ausnahme (classCast), weil offensichtlich auch in anderen Teilen des Codes ist es ein B-Typ-Objekt wartet, keine A.
Vielen Dank im Voraus.
Lösung
Sie würden diese Ausnahme, wenn man CALLER.java mit einer anderen Version von Factory.java zusammengestellt hatte, die getB A zurückkehren würde, dann aktualisiert Factory.java so dass getB B zurückkehrt, neu kompiliert dann Factory.java aber nicht CALLER.java
UPDATE:
Vielleicht möchten Sie, so etwas tun:
public abstract class Factory {
public abstract A getInstance(object o, enum e);
}
public class FactoryB extends Factory {
@Override
public B getInstance(object o,enum e){
//do something with enums and get B
b = new B();
//populate b
return b;
}
}
Aber die Fabrik würde dann instanziiert werden müssen.
Andere Tipps
Die erste sieht aus wie ein Spiegelbild Fehler. Die Java-Reflexionsklassen sucht die genaue Methodensignatur "A getB (Object, Enum)" und nicht "B getB (Object, Enum)".
Die zweite, solange Sie tatsächlich ein Objekt vom Typ B in Ihrem getB (..) Methode erstellen, wird es dieses Objekt zurück. Die classCast Ausnahme wird nur ausgelöst werden, wenn Sie einen neuen A anstelle eines neuen B erstellen.