سؤال

لدي واجهة برمجة تطبيقية خارجية (لا أستطيع تعديلها) مع فئة "A" وطبقة محلية "B" التي تتجاوز أساليب "A" وتضيف دالة إضافية. أحتاج إلى استخدام أحدهم وفقا لبعض المعلمات "IS_A".

/------ API (A.JAVA) -----/

package A;

public class A {

    public int pingA( int value ) {

        return value;

    }

}

/------ صفي (b.java) -----/

package B;

import A.*;

public class B extends A {

    @Override
    public int pingA( int value ) {
        return value;
    }

    public int pingB( int value ) {
        return value;
    }

    public static void main(String[] args) {
        final boolean is_A = false;
        A obj;
        if (is_A) {
            obj = new A();
        } else {
            obj = new B();
        }
        if (!is_A) {
            int n = obj.pingB(3);
        }
    }
}

في هذه الحالة، أريد استخدام الفئة "B"، ولكن الأمر "int n = obj.pingb (3)؛ لا يتم تجميعها لأنه لا توجد طريقة Pingb في A. الرسالة الدقيقة هي:

cannot find symbol
symbol: method pingB(int)
location: class A.A
هل كانت مفيدة؟

المحلول

تحتاج يقذف obj ارجع الى B.

if (!is_A) {
    int n = ((B) obj).pingB(3);
}

يمكنك بالمناسبة استخدام أفضل instanceof الكلمة الرئيسية بدلا من is_A.

if (obj instanceof B) {
    int n = ((B) obj).pingB(3);
}

نصائح أخرى

أنت تضيف طريقة جديدة في فئة فرعية غير موجودة في الطبقة الفائقة. لا توجد طريقة لاستدعاء الطريقة الجديدة في الفئة الفرعية باستخدام مرجع إلى Superclass. كنت يجب أن يلقي إلى نوع الفئة الفرعية لاستخدام الطريقة الجديدة.

يمكنك أن تفعل شيئا مثل:

A obj = new B();

if (obj instance of B) {
   B b = (B)obj;
   int n = b.pingB(3);
}

هنا B هو A لكن A ليس B لذلك لا يحتوي على طريقة Pingb (int).

تحتاج إلى وضعها إلى فئة مشتقة لتتمكن من الاتصال بطرقها. عادة ما يتم ذلك مع و if( obj instanceof B ) ولكن كما لديك بالفعل منطقي مع هذه المعلومات سوف تبدو وكأنها هذه:

public static void main(String[] args) { 
    final boolean is_A = false; 
    A obj; 
    if (is_A) { 
        obj = new A(); 
    } else { 
        obj = new B(); 
    } 
    if (!is_A) { 
        int n = ((B) obj).pingB(3); 
    } 
}

لا يزال OBJ لديه نوع A (-> أعلنت OBJ؛) -> بهذه الطريقة لا يعمل ربط النوع من أجل تجميع.

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