ランタイムJavaクラスの拡張機能が動作しません
-
19-09-2019 - |
質問
良い一日、 私は、次のような問題があります。 クラス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の任意のメソッドをオーバーライドしません どういうわけか、コンパイル時に、これは任意のエラーを取得するが、ランタイムクラスの発信者exceptsでではありません:java.lang.NoSuchMethodErrorの:Factory.getB(オブジェクト、列挙型)A
私の質問は:Bは、別のクラスからメソッドが返すことができない理由は、その戻り句は、直接Bオブジェクトを返す場合にも拡張する場合? 実際の交換:
public static B getB(object, enum);
タグ付き
public static A getB(object, enum);
例外を解決するが、明らかに、コードの他の部分で、それはB型オブジェクトではなく、Aを待っているので、私は別の例外(classCast)を取得します。
事前に感謝します。
解決
あなたはこの例外になるだろうし、更新Factory.java getBはBを返すように、その後、Factory.javaなくCALLER.javaを再コンパイル
UPDATE:
おそらく、あなたはこのような何かをしたい:
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;
}
}
しかし、工場は、インスタンス化される必要があろう。
他のヒント
最初の1は、反射エラーのように見えます。 Javaリフレクションクラスは、正確なメソッドシグネチャ「getB(オブジェクト、列挙型)」を見ていない「B getB(オブジェクト、列挙型)」。
第二は、限り、あなたは実際にあなたのgetB(..)メソッドにタイプBのオブジェクトを作成すると、それは、このオブジェクトを返します。あなたが代わりに新しいBの新しいAを作成した場合classCast例外がスローさのみされます。