[英]unable to get this class working in java on client code - no compilation errors but runtime
[英]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.