代码之家  ›  专栏  ›  技术社区  ›  OverLex

运行时Java类扩展不工作

  •  0
  • OverLex  · 技术社区  · 14 年前

    很好的一天, 我有以下问题: 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类的任何方法。 不知怎的,在编译时这不会得到任何错误,但在运行时类调用方例外: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。

    提前谢谢。

    2 回复  |  直到 14 年前
        1
  •  2
  •   Maurice Perry    14 年前

    如果使用另一个版本的factory.java编译caller.java时get b返回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;
        }
    }
    

    但是工厂需要被实例化。

        2
  •  0
  •   josefx    14 年前

    第一个看起来像是反射错误。Java反射类寻找确切的方法签名“GETB(对象,EnUM)”,而不是“B GETB(对象,EnUM)”。
    第二,只要在getb(..)方法中实际创建了一个b类型的对象,它就会返回这个对象。只有在创建新的a而不是新的b时,才会引发classcast异常。