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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top