extensión de tiempo de ejecución Java clase no trabaja
-
19-09-2019 - |
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.
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.