Question

Bonjour, J'ai le problème suivant: classe B étend la classe A et des méthodes à la fois sont appelés par une autre méthode dans une autre classe après classe B instanciation (exemple ci-dessous):

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;
    }
}

Classe B ne remplace pas un mode de classe A. D'une certaine façon au moment de la compilation cela ne soit pas une erreur mais excepts APPELANT classe d'exécution: java.lang.NoSuchMethodError: Factory.getB (objet, ENUM) A

Ma question est: si B extends A pourquoi une méthode d'une autre classe ne peut pas retourner A, même si la clause de retour retourne un objet B directement? En changeant de fait:

public static B getB(object, enum);

avec

public static A getB(object, enum);

permet de résoudre l'exception mais je reçois une autre exception (classCast) car il est évident dans d'autres parties du code, il est en attente d'un objet de type B, pas A.

Merci d'avance.

Était-ce utile?

La solution

Vous obtiendrez cette exception si vous aviez compilé CALLER.java avec une autre version de Factory.java qui aurait getB retour A, Factory.java puis mis à jour de sorte que retourne getB B, puis recompilé Factory.java mais pas CALLER.java

Mise à jour:

Peut-être que vous voulez faire quelque chose comme ceci:

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;
    }
}

Mais l'usine devrait alors être instancié.

Autres conseils

La première ressemble à une erreur de réflexion. Les classes de réflexion java recherchent la signature exacte de la méthode "A getB (Object, Enum)" et non "B getB (Object, Enum)".
La seconde, aussi longtemps que vous créez en fait un objet de type B dans votre méthode getB (..), il retournera cet objet. L'exception classCast ne sera levée si vous créez un nouveau A la place d'un nouveau B.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top