0

美好的一天,我有以下问题: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 为什么来自不同类的方法不能返回 A,即使它的 return 子句直接返回 B 对象?事实上改变:

public static B getB(object, enum);

public static A getB(object, enum);

解决了异常,但随后我得到了另一个异常(classCast),因为显然在代码的其他部分它正在等待 B 类型对象,而不是 A。

提前致谢。

4

2 回答 2

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

但是工厂需要被实例化。

于 2010-03-11T13:30:21.360 回答
0

第一个看起来像反射错误。Java 反射类寻找确切的方法签名“A getB(Object,Enum)”而不是“B getB(Object,Enum)”。
第二,只要你在 getB(..) 方法中实际创建了一个 B 类型的对象,它就会返回这个对象。只有当你创建一个新的 A 而不是一个新的 B 时,才会抛出 classCast 异常。

于 2010-03-11T13:57:28.590 回答