سؤال

هذا السؤال هو متابعة:لماذا لا يمكنني استدعاء أسلوب خارج مجهول فئة من نفس الاسم

هذه إجابة السؤال السابق لماذا, ولكن الآن أريد أن أعرف إذا كان javac يجب أن العثور على تشغيل(الباحث بار)?(انظر السؤال السابق أن نرى لماذا تشغيل(42) فشل)

إذا كان لا, هل هو بسبب الأخص ؟ أنها لا تنتج غامضة الرمز ؟ وجهة نظري أعتقد أن هذا هو الخلل.بينما السؤال السابق يفسر هذا القانون فشل في ترجمة أعتقد أنه كان ينبغي أن تجمع إذا javac بحثت أعلى في الشجرة إذا فشلت في العثور على تطابق في المستوى الحالي.IE.إذا هذا.تشغيل() لا يطابق ، فإنه ينبغي أن تحقق تلقائيا NotApplicable.هذا الأسلوب تشغيل.

نلاحظ أيضا أن foo(الباحث قضيب) وجدت بشكل صحيح.إذا كنت تعطي أي سبب تشغيل(الباحث بار) يجب أن لا تكون موجودة ، فإنه يجب أن يفسر أيضا لماذا فو(int بار) وجدت.

public class NotApplicable {

    public NotApplicable() {
        new Runnable() {
            public void run() {

                // this works just fine, it automatically used NotApplicable.this when it couldn't find this.foo
                foo(42);

                // this fails to compile, javac find this.run(), and it does not match
                run(42);

                // to force javac to find run(int bar) you must use the following
                //NotApplicable.this.run(42);
            }
        };
    }

    private void run(int bar) {
    }

    public void foo(int bar) {
    }
}
هل كانت مفيدة؟

المحلول

هذا السلوك من javac يتوافق مع المواصفات.انظر §15.12 استدعاء الأسلوب التعبيرات في لغة جافا مواصفات ، وتحديدا الفقرة تحت عنوان "وقت الترجمة الخطوة 1" ، موضحا معنى غير مؤهلين استدعاء الأسلوب:

إذا كان معرف يظهر ضمن نطاق (§6.3) من مرئية طريقة الإعلان بهذا الاسم, ثم يجب أن يكون هناك أرفق نوع الإعلان الذي هذا الأسلوب هو عضو فيها.اسمحوا T تكون أعمق من هذا القبيل نوع الإعلان.فئة أو واجهة البحث T.

وبعبارة أخرى ، البات طريقة اسم يتم البحث في جميع أرفق نطاقات ، الأعمق "نوع إعلان" (وهو ما يعني إما فئة أو واجهة الإعلان) الذي هو العثور على اسم هو واحد من شأنها أن تكون بحثت عن كل توقيع (في "وقت الترجمة الخطوة 2").

نصائح أخرى

يبدو وصفة الغموض و هشاشة لي - حالما طريقة جديدة تضاف في قاعدة الخاص بك فئة (حسنا, ليس لذلك من المرجح واجهة...) معنى تغييرات التعليمات البرمجية الخاصة بك تماما.

مجهول الطبقات هي قبيحة جدا بالفعل صنع هذا قليلا من صريح لا يزعجني على الإطلاق.

محاولة

NotApplicable.this.run(42);

بدلا من ذلك.

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