Avatar ·

ما الفرق بين <? super T> و <? extends T> في جينيريكس Java؟

مرحبًا أيها الزملاء! بدأت في دراسة Java generics وواجهت wildcards (الأنماط البديلة). قرأت الوثائق وشاهدت فيديوهات، لكني ما زلت مرتبكًا بين البنيتين: `` و ``. أفهم أن `? extends T` تعني "نوع ما هو نوع فرعي من T"، و `? super T` تعني "نوع ما هو نوع فائق من T". لكن عمليًا، أواجه دائمًا أخطاء في الترجمة. على سبيل المثال، لدي هذا الكود مع List: ```java public class Test { public static void addNumbers(List list) { list.add(42); // هذا يعمل } public static void readNumbers(List list) { Integer num = list.get(0); // هذا يعمل list.add(42); // خطأ في الترجمة! لماذا؟ } } ``` لماذا لا أستطيع إضافة عنصر إلى `List`، رغم أنني أستطيع القراءة منه؟ والعكس صحيح — لماذا أستطيع الإضافة إلى `List`، لكن عند القراءة منه أحصل فقط على Object؟