好一天, 我有以下问题: 类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(对象,枚举)甲

我的问题是:如果B扩展甲为什么从不同的类中的方法不能返回即使其return子句直接返回一个B对象? 实际上改变:

public static B getB(object, enum);

public static A getB(object, enum);

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

预先感谢。

有帮助吗?

解决方案

您会得到这个例外,如果你曾与Factory.java的另一个版本,将有getB返回编译CALLER.java,然后更新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(对象,枚举)”,而不是“B getB(对象,枚举)”。结果, 第二,只要你实际上是在你的getB(..)方法创建B类的一个对象,它会返回这个对象。如果你创建一个新的一个,而不是一个新的B的classCast例外才会被抛出。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top