【问题标题】:Runtime Java Class extension not working运行时 Java 类扩展不起作用
【发布时间】:2010-03-11 13:19:27
【问题描述】:

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

提前致谢。

【问题讨论】:

  • 我怀疑它在您的实际代码中没有显示在您在此处发布的伪代码中。伪代码看起来不错。
  • 堆栈跟踪在代码中的哪个位置指示异常被抛出?
  • 删除您的构建并重新编译所有类 - 仍然没有编译时错误?
  • @Thomas 完全重建工作!谢谢!

标签: java runtimeexception


【解决方案1】:

如果你用另一个版本的 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;
    }
}

但是工厂需要实例化。

【讨论】:

  • 这正是我所做的......为什么会出现这个错误? CALLER.java 调用一个从未改变其签名的方法......我的意思是现在 B 扩展了 A 吗?
  • 根据你的说法,该方法确实改变了它的签名——它的返回类型已经改变。只需重新编译所有内容 - 一般来说,您不应出于此类原因混合新旧 .class 文件。
  • @Lex - 如果你改变一个类,你需要重新编译它和任何其他依赖它的类。
  • @Lex:因为 CALLER 期望 Factory.getB() 返回 A 而不是 B。不能覆盖静态方法。也许你想声明一个抽象工厂类(或接口),然后为每个 A 类提供它的子类。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多