رسم الخرائط الآمنة من الفئة إلى شيء
-
25-09-2019 - |
سؤال
أرغب في عمل مجموعة من الحاوية التي تحتوي على الواجهة التالية:
public <T> Thing<T> get(Class<T> clazz);
public <T> void put(Class<T> clazz, Thing<T> thing);
النقطة المثيرة للاهتمام هي أن T
S في كل 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>
. يمكنك وضع الأشياء فيه ، أو أطفال ، أو حفيد ، ولكن عندما تستعيدها ، فأنت تضمن فقط أنه شيء ، لا يمكنك معرفة ما إذا كان طفلًا أو حفيدًا ، دون اختباره فعليًا.