هل هو ممارسة جيدة لتحل محل الفئة مع فئة <؟ يمتد كائن> لتجنب التحذيرات؟

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

سؤال

في مجموعة س 'الأماكن في قانون بلدي، وأنا لديك شيء من هذا القبيل:

public Class mySpecialMethod() {
  return MySpecialClass.class;
}

والذي يسبب التحذير

<اقتباس فقرة>   

والفئة هي نوع الخام. ما يشير إلى   يجب أن تكون عامة نوع الفئة   معلمات.

ولكن، إذا كنت استبدال

وClass

مع

وClass<? extends Object>

والتحذير يذهب بعيدا.

هل هذه الممارسة بسيطة طيب، أو يمكن أن يسبب المتاعب في وقت لاحق؟

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

المحلول

وهذا هو الشيء الصحيح للقيام إلا إذا كان هناك حقا أي فئة قاعدة مشتركة أو واجهة التي يحتاجها الكائن فئة لتمثيل.

وأيضا Class<?> غير فعال نفس Class<? extends Object>.

نصائح أخرى

نعم، هذا صحيح تماما.

وانها شرط من تحديد نوع. وإذا كنت لا تستطيع، لديك لتحديد البدل.

ومزيد من القراءة: لغة جافا المواصفات: أنواع معلمات

واعتمادا على ما تريد تحقيقه، يمكنك أن تكون أكثر دقة:

public Class<MySpecialClass> mySpecialMethod() {
  return MySpecialClass.class;
}

وليست في الحقيقة مبرمج جافا هنا، ولكن قراءة بعض الأوراق الجيدة حول الوراثة.

نعم، يجب عليك إضافة بعض البدل أو نوع الدقيق (Class<MySpecialClass>) لإضافة الأمان. والسبب هو أن الفئة هي عامة. لذا، Class<Bar> وClass<Foo> هي نفسها بعد محو نوع المعلمة من العامة. أنهم جميعا تصبح Class، ما يسمى نوع الخام. أن محو يحدث عند تجميع. بعض الأمثلة لتوضيح هذا حيث مترجم يساعدك مع صب التلقائي (معالجة استثناء حذفت الإيجاز):

class Mine { }

class Vara {
    public static void main(String... args) {
        { // works. translated to Mine m = (Mine) c.newInstance();
            Class<Mine> c = Mine.class;
            Mine m = c.newInstance();
        }
        { // doesn't work. need a cast: Mine m = (Mine) c.newInstance();
            Class c = Mine.class; // also Class<?> or Class<? extends Object>
            Object o = c.newInstance(); // but this works. pointing to a Mine
            Mine m = (Mine) c.newInstance(); // needs a manual cast
        }
    }
}

وقول Class<?>Class<? extends Object> ما يعادلها)، وكنت اقول المترجم كنت حقا تريد من الفئة التي T هو كائن، ولم تستخدم عن طريق الخطأ في نوع الخام. لكنها لن تضيف أي سقط الراحة. كل ما الأدوية القيام به هو إدخال يلقي التلقائي بالنسبة لك، ليلقي من Object لنوع الوجهة. الوراثة هي نفسها سواء استخدمت مع نوع U أو مع نوع T في وقت التشغيل لأسباب التوافق مع الإصدارات القديمة جافا.

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