[英]unable to get this class working in java on client code - no compilation errors but runtime
[英]Runtime Java Class extension not working
美好的一天,我遇到以下问题:类B扩展了类A,并且实例化类B后,另一个类中的另一个方法调用了这两种方法:
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;
}
}
类B不会覆盖类A的任何方法。在编译时,这不会产生任何错误,但是在运行时类CALLER除外:java.lang.NoSuchMethodError:Factory.getB(object,enum)A
我的问题是:如果B扩展了A,即使其他类的方法的return子句直接返回B对象,为什么它也不能返回A? 实际上正在改变:
public static B getB(object, enum);
同
public static A getB(object, enum);
解决了异常,但随后又得到另一个异常(classCast),因为显然在代码的其他部分,它正在等待B类型对象,而不是A。
提前致谢。
如果您用另一个版本的Factory.java编译了CALLER.java,则该异常将使getB返回A,然后更新Factory.java,以便getB返回B,然后重新编译Factory.java,但不重新编译CALLER.java,就会出现此异常。
更新:
也许您想做这样的事情:
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;
}
}
但是这时需要实例化工厂。
第一个看起来像是反射错误。 Java反射类将查找确切的方法签名“ A getB(Object,Enum)”,而不是“ B getB(Object,Enum)”。
第二,只要您实际上在getB(..)方法中创建类型B的对象,它将返回该对象。 仅当您创建一个新的A而不是一个新的B时,才会引发classCast异常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.