Domanda

Buona giornata, Ho il seguente problema: classe B estende classe A e metodi di entrambi sono chiamato da un altro metodo in un'altra classe dopo un'istanza di classe B (esempio segue):

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 non sovrascrive qualsiasi metodo di classe A. In qualche modo al momento della compilazione questo non c'è niente di errore, ma a runtime excepts classe chiamante: java.lang.NoSuchMethodError: Factory.getB (oggetto, enum) A

La mia domanda è: se B si estende Un motivo per cui un metodo da una classe diversa non può restituire A anche se la sua clausola di ritorno restituisce direttamente un oggetto B? In realtà che cambia:

public static B getB(object, enum);

con

public static A getB(object, enum);

risolve l'eccezione ma tanto sono un'altra eccezione (classCast) perchè ovviamente in altre parti del codice è in attesa di un oggetto di tipo B, non un A.

Grazie in anticipo.

È stato utile?

Soluzione

Si potrebbe ottenere questa eccezione se si fosse compilato CALLER.java con un'altra versione di Factory.java che avrebbe getB ritorno A, poi aggiornato Factory.java in modo che getB ritorna B, quindi ricompilato Factory.java ma non CALLER.java

UPDATE:

Forse si vuole fare qualcosa di simile:

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

Ma la fabbrica avrebbe quindi bisogno di essere istanziare.

Altri suggerimenti

Il primo si presenta come un errore di riflessione. Le classi java riflessione cercare il metodo esatto firma "A getB (Object, Enum)" e non "B getB (Object, Enum)".
Il secondo, fino a quando si effettivamente creare un oggetto di tipo B nel metodo getB (..), verrà restituito questo oggetto. L'eccezione classCast sarà gettato solo se si crea una nuova A invece di un nuovo B.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top