Pregunta

Buenos días, Tengo el siguiente problema: clase B se extiende la clase A y métodos de ambos se llaman por otro método en otra clase después de crear instancias de la clase B (ejemplo sigue):

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

Clase B no anula cualquier método de clase A. De alguna manera en tiempo de compilación esto no consigue ningún error, pero en tiempo de ejecución exceptúa LLAMANTES clase: java.lang.NoSuchMethodError: Factory.getB (objeto, enum) A

Mi pregunta es: si B se extiende Una razón por un método de una clase diferente no puede devolver un incluso si su cláusula de retorno devuelve un objeto B directamente? En cambio hecho:

public static B getB(object, enum);

con

public static A getB(object, enum);

resuelve la excepción pero cuando me siento otra excepción (classCast) porque, obviamente, en otras partes del código que está en espera de un objeto de tipo B, no una A.

Gracias de antemano.

¿Fue útil?

Solución

Puede conseguir esta excepción si se había compilado CALLER.java con otra versión de Factory.java que tendría getB volviendo A, entonces actualizada Factory.java modo que vuelve getB B, a continuación, volver a compilar Factory.java pero no CALLER.java

ACTUALIZACIÓN:

Tal vez usted quiere hacer algo como esto:

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

Pero entonces tendría que ser instanciado la fábrica.

Otros consejos

La primera de ellas se ve como un error de reflexión. Las clases Java reflexión buscan la firma del método exacto "Un getB (Object, Enum)" y no "B getB (Object, Enum)".
El segundo, siempre y cuando en realidad se crea un objeto de tipo B en su método getB (..), regresará este objeto. La excepción classCast sólo se produce si se crea una nueva A en lugar de un nuevo B.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top