جافا الوراثة: نوع عام تعرف بأنها نوع الإرجاع فقط

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

  •  19-08-2019
  •  | 
  •  

سؤال

وأنا أبحث في بعض رمز GXT لGWT وجريت عبر هذا استخدام الأدوية الجنيسة التي لا أستطيع أن أجد مثال آخر في البرامج التعليمية جافا. اسم الفئة هو com.extjs.gxt.ui.client.data.BaseModelData إذا تريد أن ننظر إلى كافة التعليمات البرمجية. وفيما يلي أجزاء هامة:

private RpcMap map;

public <X> X get(String property) {
  if (allowNestedValues && NestedModelUtil.isNestedProperty(property)) {
    return (X)NestedModelUtil.getNestedValue(this, property);
  }
  return map == null ? null : (X) map.get(property);
}

ويعرف X في أي مكان آخر في الصف أو في أي مكان في التسلسل الهرمي، وعندما ضرب "الذهاب إلى إعلان" في كسوف فإنه يذهب فقط إلى <X> في توقيع الأسلوب العام.

ولقد حاولت أن نسمي هذا الأسلوب مع المثالان لنرى ماذا سيحدث:

public Date getExpiredate() {
    return  get("expiredate");
}

public String getSubject() {
    return  get("subject");
}

وأنها تجميع وإظهار عدم وجود أخطاء أو تحذيرات. أعتقد أن على أقل تقدير وأود أن تفعل المدلى بها للحصول على هذا العمل.

هل هذا يعني أن الوراثة تسمح قيمة إرجاع السحرية التي يمكن أن تكون أي شيء وسوف تهب للتو في وقت التشغيل؟ ويبدو أن هذا يتعارض مع ما يفترض الوراثة القيام به. هل يستطيع أحد أن يفسر هذا بالنسبة لي وربما تعطيني رابط لبعض الوثائق التي تشرح أفضل هذا قليلا؟ لقد مرت الشعبي 23 صفحة الشمس على الأدوية وكل سبيل المثال من قيمة الإرجاع يعرف سواء على مستوى الفئة أو هو في واحدة من المعلمات التي تم تمريرها في.

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

المحلول

والأسلوب بإرجاع نوع ما كنت أتوقع أن يكون (ويعرف <X> في الأسلوب وليس غير محدود على الاطلاق).

وهذا هو خطر جدا أن يتم إجراء أي حكم أن نوع الإرجاع في الواقع يطابق القيمة التي تم إرجاعها.

والميزة الوحيدة هذا الأمر هو أنك ليس لديك لتحويل قيمة الإرجاع من هذه الأساليب بحث العامة التي يمكن إرجاع أي نوع.

وأقول: استخدام هذه البنى مع الرعاية، لأنك تخسر حد كبير كل نوع السلامة وكسب فقط أن لم يكن لديك لكتابة يلقي صريحة في كل استدعاء get()

.

ونعم: هذا الى حد كبير هو السحر الأسود الذي يفجر في وقت التشغيل ويكسر فكرة كاملة من ما ينبغي أن يحقق الوراثة

نصائح أخرى

ويتم تعريف النوع على الأسلوب. هذا هو ذلك "<X>" وسيلة. وخاصة بتطبيق نوع ثم إلى مجرد طريقة وذات الصلة لدعوة خاصة. السبب يجمع رمز اختبار الخاص بك هو أن المترجم يحاول تحديد نوع وسوف يشكو إلا إذا كان لا يمكن. هناك حالات حيث لديك لتكون واضحة.

وعلى سبيل المثال، فإن الإعلان عن Collections.emptySet() عبارة

public static final <T> Set<T> emptySet()

في هذه الحالة، يمكن للمترجم تخمين:

Set<String> s = Collections.emptySet();

ولكن إذا كان لا يمكن، يجب عليك كتابة:

Collections.<String>emptySet();

وكنت للتو في محاولة لمعرفة الشيء نفسه مع فئة GXT. على وجه التحديد كنت أحاول أن استدعاء أسلوب مع توقيع:

class Model {
    public <X> X get(String property) { ... }
}

لاستدعاء الأسلوب أعلاه من التعليمات البرمجية الخاصة بك، وأنها يلقي X لسلسلة أفعل ما يلي:

public String myMethod(Data data) {
    Model model = new Model(data);
    return model.<String>get("status");
}

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

في الحالة التي يكون فيها الأسلوب هو في نفس الفئة كما كنت، لقد وجدت أن لدي أن نسميها ب "هذا". على سبيل المثال:

this.<String>get("status");

وكما قال آخرون، وهذا هو قذر نوعا ما، والخطير من قبل فريق GXT.

وBaseModelData يثير تحذيرات مطلقة عند تصنيف، لأنها غير آمنة. تستخدم مثل هذه، سوف التعليمات البرمجية رمي ClassCastException في وقت التشغيل، على الرغم من أنه ليس لديه أي تحذيرات نفسها.

public String getExpireDate() {
  return  get("expiredate");
}

ومثيرة للاهتمام ملاحظة، من <لأ href = "http://extjs.com/deploy/gxtdocs/com/extjs/gxt/ui/client/data/RpcMap.html#get(java.lang.Object)" يختلط = "نوفولو noreferrer"> RpcMap (GXT API 1.2)

والحصول على رأس:

public java.lang.Object get(java.lang.Object key)

وجود معلمة عامة من <X> في وجود هذا ما uninstantiated له نفس التأثير، إلا أنك لا يجب أن أقول "كائن" في كل مكان. وأنا أتفق مع ملصق آخر، وهذا هو قذرة وخطرة بعض الشيء.

نعم، هذا أمر خطير. عادة، وكنت حماية هذا الرمز مثل ذلك:

<X> getProperty(String name, Class<X> clazz) {
   X foo = (X) whatever(name);
   assert clazz.isAssignableFrom(foo);
   return foo;
}

String getString(String name) {
  return getProperty(name, String.class);
}

int getInt(String name) {
  return getProperty(name, Integer.class);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top