美好的一天, 我有以下问题: 在实例化类B后,类B扩展了类A,并且两个方法都被另一个类中的另一个方法调用(示例如下):
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为什么来自不同类的方法不能返回A,即使它的return子句直接返回B对象? 实际上在改变:
public static B getB(object, enum);
与
public static A getB(object, enum);
解决了异常但后来又得到了另一个异常(classCast),因为很明显在代码的其他部分它正在等待B类型的对象,而不是A。
提前致谢。
答案 0 :(得分:2)
如果您使用另一个版本的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;
}
}
但是工厂需要进行实例化。
答案 1 :(得分:0)
第一个看起来像反射错误。 java反射类查找确切的方法签名“A getB(Object,Enum)”而不是“B getB(Object,Enum)”。
第二,只要你在getB(..)方法中实际创建了一个B类型的对象,它就会返回这个对象。只有在创建新的A而不是新的B时才会抛出classCast异常。