سؤال

أرغب في عمل مجموعة من الحاوية التي تحتوي على الواجهة التالية:

public <T> Thing<T> get(Class<T> clazz);
public <T> void put(Class<T> clazz, Thing<T> thing);

النقطة المثيرة للاهتمام هي أن TS في كل Class<T> -> Thing<T> الزوج هو نفسه T, ، ولكن يجب أن تكون الحاوية قادرة على الاحتفاظ بالعديد من الأنواع المختلفة من الأزواج. في البداية حاولت (التجزئة)خريطة. ولكن ، على سبيل المثال ،

Map<Class<T>, Thing<T>>

ليس صحيحًا ، لأنه بعد ذلك T سيكون هو نفسه T ل الكل أزواج في تلك الخريطة. بالتاكيد،

Map<Class<?>, Thing<?>>

يعمل ، ولكن بعد ذلك ليس لدي ضمانات لسلامة النوع حتى عندما أكون get(String.class), ، لا يمكنني التأكد من أنني أحصل على ملف Thing<String> على سبيل المثال العودة.

هل هناك طريقة واضحة لإنجاز نوع السلامة من النوع الذي أبحث عنه؟

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

المحلول

لن تضمن الخريطة نفسها ذلك ، ولكن إذا كنت تصل إليها فقط من خلال الطرق المذكورة أعلاه ، فستكون لديك السلامة المطلوبة.

نصائح أخرى

إذا كنت تريد أن تكون قادرًا على وضع أنواع مختلفة ، ألا يجب أن تعلن معلمتين من النوع؟

public <K, V> Thing<V> get(Class<K> clazz);
public <K, V> void put(Class<K> clazz, Thing<V> thing);

أو هل أسيء فهم السؤال؟

تحرير: أرى ، حسنًا ، إذا كنت تريد o حاوية يمكنها عقد كيانات من أنواع مختلفة ، فلا توجد طريقة يمكنك الحصول على سلامة من النوع الكامل ، لأنه عندما تعلن الحاوية الخاصة بك ، يمكنك وضع نوع واحد فقط على الحاوية ثم قد تكون قادرًا على ذلك لوضع الأشياء ، ولكن لا يمكنك التأكد من ما تعود إليه. في أحسن الأحوال ، ستنتهي في وضع الأشياء ككائن ، ثم القيام بمثابة ويلقي عند استعادتها. جميع المجموعات لديها هذه المشكلة. تخيل أن لديك Collection<T extends Thing>. يمكنك وضع الأشياء فيه ، أو أطفال ، أو حفيد ، ولكن عندما تستعيدها ، فأنت تضمن فقط أنه شيء ، لا يمكنك معرفة ما إذا كان طفلًا أو حفيدًا ، دون اختباره فعليًا.

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