运行时Java类扩展无法正常工作

时间:2010-03-11 13:19:28

标签: java runtimeexception

美好的一天, 我有以下问题: 在实例化类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。

提前致谢。

2 个答案:

答案 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异常。