質問

良い一日、 私は、次のような問題があります。 クラス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)を取得します。

事前に感謝します。

役に立ちましたか?

解決

あなたがgetBを返すだろうFactory.javaの別のバージョンでCALLER.javaをコンパイルした場合は、

あなたはこの例外になるだろうし、更新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例外がスローさのみされます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top