سؤال

يوم جيد، لدي المشكلة التالية: فئة B تمتد الفئة A وطرق كليهما يتم استدعاؤها بواسطة طريقة أخرى في فئة أخرى بعد إنشاء فئة Instantiating 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. بطريقة أو بأخرى في وقت الترجمة هذا لا يحصل على أي خطأ ولكن في وقت التشغيل Class المتصل باستثناء: java.lang.nosuchmethoderror: Factory.getB (Object، Enum)

سؤالي هو: إذا تمدد B لماذا لا يمكن للطريقة من فئة مختلفة إرجاعها حتى إذا عودة جملة العائد الخاصة به كائن B مباشرة؟ في الواقع تغيير:

public static B getB(object, enum);

مع

public static A getB(object, enum);

يحل الاستثناء ولكن بعد ذلك، أحصل على استثناء آخر (Classcast) لأنه من الواضح أنه في أجزاء أخرى من التعليمات البرمجية، فإنه ينتظر كائن نوع B، وليس A.

شكرا مقدما.

هل كانت مفيدة؟

المحلول

ستحصل على هذا الاستثناء إذا كنت قد قمت بتجميع المتصل .java مع إصدار آخر من Factory.java من شأنه أن يعود GetB A، ثم محدث Factory.java بحيث إرجاع GetB B، ثم إعادة ترجمة Factory.java ولكن ليس المتصل .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 عن توقيع الطريقة الدقيقة "GetB (كائن، Enum)" وليس "B GetB (كائن، ENUM)".
والثاني، طالما كنت تقوم بالفعل بإنشاء كائن من النوع B في طريقة GetB (..)، سيعود هذا الكائن. سيتم إلقاء استثناء Classcast إلا إذا قمت بإنشاء جديد بدلا من جديد B.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top