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