غير قادر على جعل إشارة ثابتة لفئة فرعية العامة (جافا)

StackOverflow https://stackoverflow.com/questions/677226

سؤال

ولدي البرمجية التالية:

class SuperClass {
    public static String getName() { return "super"; }
}

class SubClass extends SuperClass {
    public static String getName() { return "sub"; }
}

public class Dummy<T extends SuperClass> {
    public void print() {
        System.out.println("SuperClass: " + SuperClass.getName());
        System.out.println("SubClass: " + SubClass.getName());
        System.out.println("T: " + T.getName());
    }
    public static void main(String[] args) {
        new Dummy<SubClass>().print();
    }
}

وهذا الرمز إخراج ما يلي:

SuperClass: super
SubClass: sub
T: super

وسؤالي هو: لماذا لا T.getName () إرجاع قيمة SubClass.getName ()؟ بعد كل شيء، وأنا على وجه التحديد أن T == فئة فرعية. أو هي تدعو ظيفة ثابتة غير صالحة للمراجع العامة؟

وشكرا جزيلا مقدما!

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

المحلول

وهذه ليست مجرد قضية حول الوراثة.

إذا أنت تقول:

SuperClass obj = new SubClass();
System.out.println(obj.getName());

وستحصل أيضا على "السوبر". لا توجد أساليب ثابتة "متعددة الأشكال".

في الحالة الخاصة بك، كل مترجم يعرف عن T هو أنه يمتد SuperClass، لذلك فإنه سيتم استدعاء SuperClass.getName().

نصائح أخرى

وعلى عكس القوالب C ++، جافا الوراثة العمل حسب نوع المحو، لذلك يولد إلا فئة واحدة لجميع قيم T، ويترجم كل ما يشير إلى نوع T في هذه الفئة لنوع سوبر T، في هذه الحالة SuperClass، ثم الاستخدامات إرسال الظاهري لتوفير التباين للمكالمات الاعتراض الأساليب، وإرسال ثابت إلى المكالمات إلى أساليب ثابتة.

وهكذا عندما تفعل Dummy<SubClass>.print()، المترجم لا يجعل استبدال العالمية من T مع SubClass في Dummy. كل مترجم هل هو الاختيار الذي يستخدم من T كحجة أو نوع الإرجاع في أساليب Dummy هي SubClass. ليس هناك تغيير في أي رمز داخل Dummy، وبالتالي فإن نفس الأسلوب SuperClass ثابت يحصل على استدعاء كل ما هو T.

إذا كنت تريد سلوك مختلف في فئة عامة تبعا لنوع parameterised، لديك تمرير كائن من هذا النوع في واستخدام أسلوب ظاهري، أو تمرير في فئة لنوع واستخدام التفكير.

عند instanciated الطبقة مع "الدمية الجديدة ()" قمت بالاتصال منشئ الافتراضية التي لا تضع اي شيء في الواقع. عندما حصلت على طريقة طباعة ودعا، شهد VM أن هذا النوع من T، وفقا لما أعلن في تعريف فئة، هو الفائقة. ومن ثم باستدعاء أسلوب ثابت في هذه الفئة.

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