簡體   English   中英

運行時Java類擴展不起作用

[英]Runtime Java Class extension not working

美好的一天,我遇到以下問題:類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,即使其他類的方法的return子句直接返回B對象,為什么它也不能返回A? 實際上正在改變:

public static B getB(object, enum);

public static A getB(object, enum);

解決了異常,但隨后又得到另一個異常(classCast),因為顯然在代碼的其他部分,它正在等待B類型對象,而不是A。

提前致謝。

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

但是這時需要實例化工廠。

第一個看起來像是反射錯誤。 Java反射類將查找確切的方法簽名“ A getB(Object,Enum)”,而不是“ B getB(Object,Enum)”。
第二,只要您實際上在getB(..)方法中創建類型B的對象,它將返回該對象。 僅當您創建一個新的A而不是一個新的B時,才會引發classCast異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM