0

良い日、私は次の問題を抱えています:クラス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);

例外を解決しますが、コードの他の部分では明らかにAではなくBタイプのオブジェクトを待機しているため、別の例外(classCast)が発生します。

前もって感謝します。

4

2 に答える 2

2

getBがAを返す別のバージョンのFactory.javaでCALLER.javaをコンパイルし、getBがBを返すようにFactory.javaを更新してから、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;
    }
}

しかし、その場合、工場はインスタンス化される必要があります。

于 2010-03-11T13:30:21.360 に答える
0

最初のものは反射エラーのように見えます。Javaリフレクションクラスは、「B getB(Object、Enum)」ではなく、正確なメソッドシグネチャ「AgetB(Object、Enum)」を検索します。
2つ目は、getB(..)メソッドでタイプBのオブジェクトを実際に作成している限り、このオブジェクトを返します。classCast例外は、新しいBではなく新しいAを作成した場合にのみスローされます。

于 2010-03-11T13:57:28.590 に答える